1

次のコードを使用して、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 とwCodePage1200 でエンコードされた文字列テーブルがあります。その場合VerQueryValue、エラー コード で失敗しますERROR_RESOURCE_TYPE_NOT_FOUND。しかし、エクスプローラーで確認すると、そのファイルには「ファイルの説明」プロパティがあることがわかります。

ここに画像の説明を入力

では、上記のコードで何が間違っているのでしょうか?

4

1 に答える 1