我有以下代码来枚举给定.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
是一个空白字符串。为什么会这样?
最佳答案
如果您阅读documentation,则会显示:
lpszType [输入]
类型:LPTSTR
枚举类型的资源的类型。或者,此参数可以是MAKEINTRESOURCE(ID),而不是指针,其中ID是给定资源类型的整数标识符。
...
如果IS_INTRESOURCE(lpszType)为TRUE,则lpszType指定给定资源类型的整数标识符。否则,它是一个以空字符结尾的字符串的指针。
另外this documentation说:
请注意,EnumResTypeProc中的lpszType是资源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;
}