次のコードを使用して、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
。しかし、エクスプローラーで確認すると、そのファイルには「ファイルの説明」プロパティがあることがわかります。
では、上記のコードで何が間違っているのでしょうか?