我正在尝试使用以下代码从 PE 文件中检索文件描述:
//This code was simplified &
//most error checks were removed for brevity
BYTE* pData = new BYTE[4096];
LPCTSTR path = L"C:\\Windows\\system32\\Speech\\Engines\\TTS\\MSTTSEngine.dll";
if(::GetFileVersionInfo(path, NULL, 4096, pData))
{
struct LANGANDCODEPAGE
{
WORD wLanguage;
WORD wCodePage;
} *lpTranslate = NULL;
UINT cbTranslate;
if(VerQueryValue(pData, L"\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &cbTranslate))
{
CString strBlock;
strBlock.Format(L"\\StringFileInfo\\%04x%04x\\FileDescription",
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage
);
UINT dwProdLn = 0;
VOID* lpBufferName = NULL;
if(VerQueryValue(pData, strBlock, &lpBufferName, &dwProdLn))
{
TRACE(L"Description: %s", lpBufferName);
}
else
{
TRACE(L"Error=%d", ::GetLastError());
}
}
delete[] pData;
}
该特定文件(如果您的 Windows 10 上没有它,这里是副本wLanguage
)具有编码为 0 和wCodePage
1200 的字符串表。在这种情况下VerQueryValue
失败并显示错误代码ERROR_RESOURCE_TYPE_NOT_FOUND
。但是当我在文件资源管理器中检查该文件时,我知道该文件具有“文件描述”属性:
那么我在上面的代码中做错了什么?