我有以下代码来枚举给定.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;
}

07-27 13:58