-
问题内容:用API枚举字符串资源
- 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5068821
- 所属论坛:界面
审核组:VC/MFC
- 提问者:AgedBOY
解决者:pomelowu
- 感谢:pomelowu zhucde BOYGUARD110
- 关键字:VC/MFC 函数 API 指针 资源 界面 string 字符 串 http 枚举 送来
- 答案:
用API枚举字符串资源
请各位高手帮忙:
我想枚举PE文件里的String Table的一个个String。只要枚举出ID即可。
我用EnumResourceName来做如下枚举:
EnumResourceNames(hMyDll, RT_STRING, EnumStrResFunc, (LONG_PTR)&UserData);
结果用一个有十来个字符串的DLL来试验,枚举回调函数才被调了4次?!而且每次送来的lpszName的值根本就不能用!
MSDN上说lpszName的值,不是字符串形式的资源名,就是直接的ID值。可回调函数送来的值好像什么也不是!我不知道该怎样利用这个值。
我试着用 FindResource -> LoadResource -> LockResource 从回调函数送来的lpszType和lpszName获得一个void*指针,结果查看指针地址,发现里面只有一些乱七八糟的字符串,不是我想要的。
请问该如何用Win32 API来枚举(搜索)一个DLL或exe里面的所有字符串资源?就好像资源修改器所做的那样。
难道要用 for(i = 1~65535) LoadString(i)吗?这样会很慢吧?!
---------------------------------------------------------------
参考MSDN例程
找到
hResInfo = FindResourceEx(hModule, lpType, lpName, wLang);
这个语句,在后面加上
HGLOBAL hg = LoadResource(hModule, hResInfo);
LPVOID lp = LockResource(hg);
你看看lp指向的地址里边写的是什么。:)
例程
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/resources/introductiontoresources/usingresources.asp?frame=true#_win32_Creating_a_Resource_List
---------------------------------------------------------------
msdn上说,【String resources are stored in sections of up to 16 strings per section. The strings in each section are stored as a sequence of counted (not null-terminated) Unicode strings.】,EnumNamesFunc里边的lpName要么是一个字符指针,以#开头,后面是section序号,要么是一个最高位为0的整形数据(强制转换一下为ULONG),也是这个Section序号。
---------------------------------------------------------------
mark
//
// Stablupd.exe Manipulate String Resources in an Executable
// Article ID : 196774
//
http://support.microsoft.com/kb/q196774/
//
// The format of string resources
//
http://blogs.msdn.com/oldnewthing/archive/2004/01/30/65013.aspx
- 评价:
给朵鲜花(20)
扔个鸡蛋(8)