我有下面的代码来枚举给定.exe中的所有资源文件
BOOL CALLBACK EnumResNameProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lpszName, LONG_PTR lParam);
BOOL CALLBACK EnumResTypeProc(HMODULE hModule, LPTSTR lpType, LONG_PTR lParam);
REMOTECONTROL_API BOOL EnumResources(LPCWSTR file1, LPCWSTR file2)
{
HMODULE hFile = LoadLibrary(file1);
BOOL bSuccess = EnumResourceTypes(hFile, EnumResTypeProc, NULL);
FreeLibrary(hFile);
return bSuccess;
}
BOOL CALLBACK EnumResNameProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lpszName, LONG_PTR lParam)
{
return TRUE;
}
BOOL CALLBACK EnumResTypeProc(HMODULE hModule, LPTSTR lpType, LONG_PTR lParam)
{
MessageBox(NULL, lpType, L"Type", 0);
return TRUE;
}但是,当调用EnumResTypeProc回调时,参数lpType是一个空字符串。
为什么会发生这种事?
发布于 2014-08-23 23:12:19
如果你读了文档,上面写着:
lpszType in 类型: LPTSTR是枚举该类型的资源的类型。替代指针,这个参数可以是MAKEINTRESOURCE( ID ),其中ID是给定资源类型的整数标识符. ..。 如果IS_INTRESOURCE( lpszType )为真,则lpszType指定给定资源类型的整数标识符。否则,lpszType是指向以空结尾的字符串的指针。
这份文件还说:
注意,EnumResTypeProc中的EnumResTypeProc是,或者是资源ID,或者是指向字符串(包含资源ID或类型名称)的指针;EnumResNameProc和EnumResLangProc中的lpszType和lpszName是相似的。
这意味着回调的lpType参数并不总是指向字符串的指针,就像您假设的那样。有时,它是一个被类型转换为指针的数字。
试试这个:
BOOL CALLBACK EnumResTypeProc(HMODULE hModule, LPWSTR lpType, LONG_PTR lParam)
{
WCHAR szMsg[256];
if (IS_INTRESOURCE(lpType))
StringCchPrintfW(szMsg, 256, L"Type: %u", (USHORT)lpType);
else
StringCchPrintfW(szMsg, 256, L"Type: %s", lpType);
MessageBoxW(NULL, szMsg, L"Type", 0);
return TRUE;
}
REMOTECONTROL_API BOOL EnumResources(LPCWSTR file1, LPCWSTR file2)
{
BOOL bSuccess = FALSE;
HMODULE hFile = LoadLibraryExW(file1, NULL, LOAD_LIBRARY_AS_DATAFILE);
if (hFile != NULL)
{
bSuccess = EnumResourceTypesW(hFile, EnumResTypeProc, NULL);
FreeLibrary(hFile);
}
return bSuccess;
}https://stackoverflow.com/questions/25465970
复制相似问题