0

ファイルからバージョン情報を取得しようとしています。私のコードは完全に機能しますが、他のいくつかのマシンでは失敗します。バグを再現できないため、問題を見つけるのにかなりの時間を費やしています。

誰かがこれに大きな問題があると思いますか?

LPBYTE versionInformationBlock;
struct LANGANDCODEPAGE {
    WORD wLanguage;
    WORD wCodePage;
} *langBlockPointer;
UINT translationsCount;

void fileData::enumVersionInformationBlock()
{
    bits.set(VERSIONINFOCHECKED);
    disable64.disableFS(); //Shut down WOW64
    DWORD zero = 0;
    DWORD lengthOfVersionData =
    GetFileVersionInfoSize(getFileName().c_str(),&zero);
    if (!lengthOfVersionData)
    {
        disable64.enableFS();
        return;
    }
    versionInformationBlock = new BYTE[lengthOfVersionData];
    GetFileVersionInfo(getFileName().c_str(),zero,lengthOfVersionData,versionInformationBlock);
    VerQueryValue(versionInformationBlock,L"\\VarFileInfo\\Translation",(LPVOID*)&langBlockPointer,&translationsCount);
    translationsCount /= sizeof(struct LANGANDCODEPAGE);
    disable64.enableFS();
}
std::wstring fileData::getVersionInformationString(const std::wstring& str)
{
    if (!bits[VERSIONINFOCHECKED])
        enumVersionInformationBlock();
    if (!versionInformationBlock)
        return L"!VERINFO: NOT PE FILE!";
    LPCTSTR retString;
    UINT retStringLength;
    std::wstring result;
    static const wchar_t hexChars[] = L"0123456789ABCDEF";
    wchar_t hexLanguage[26] = L"\\StringFileInfo\\        \\";
    for( size_t idx = 0; idx < translationsCount; idx++ )
    {
        hexLanguage[16] = *(hexChars + ((langBlockPointer[idx].wLanguage >> 12) & 0x0F));
        hexLanguage[17] = *(hexChars + ((langBlockPointer[idx].wLanguage >> 8 ) & 0x0F));
        hexLanguage[18] = *(hexChars + ((langBlockPointer[idx].wLanguage >> 4 ) & 0x0F));
        hexLanguage[19] = *(hexChars + ( langBlockPointer[idx].wLanguage        & 0x0F));
        hexLanguage[20] = *(hexChars + ((langBlockPointer[idx].wCodePage >> 12) & 0x0F));
        hexLanguage[21] = *(hexChars + ((langBlockPointer[idx].wCodePage >> 8 ) & 0x0F));
        hexLanguage[22] = *(hexChars + ((langBlockPointer[idx].wCodePage >> 4 ) & 0x0F));
        hexLanguage[23] = *(hexChars + ( langBlockPointer[idx].wCodePage        & 0x0F));
        std::wstring targetResource(hexLanguage,25);
        targetResource.append(str);
        if (!VerQueryValue(versionInformationBlock,targetResource.c_str(),(LPVOID *)&retString,&retStringLength))
        {
            return std::wstring(L"!DOESN'T APPER TO EXIST IN FILE! ERROR: ").append(boost::lexical_cast<std::wstring>(GetLastError()));
        }
        retStringLength--;
        if (!result.empty())
            result.append(L" / ");
        std::wstring toAppend;
        toAppend.assign(retString,retStringLength);
        boost::algorithm::trim(toAppend);
        result.append(toAppend);
    }
    return result;
}
std::wstring fileData::getVerCompany()
{
    return getVersionInformationString(L"CompanyName");
}
~fileData()
{
    if (versionInformationBlock)
        delete [] versionInformationBlock;
};

私を本当に悩ませているのは、エラーメッセージがスローされないことです...ゴミを返し続けます。

何か案は?

ビリー3

4

3 に答える 3

4

次のことを試してください。

  • GetFileVersionを使用して の失敗の理由を取得しますGetLastError
  • 動作するOSと動作しないOSを教えてください
  • 成功するかどうかを確認しますGetFileVersionInfo(再びGetLastError
  • 上記の関数の MSDN ドキュメントの備考セクションを繰り返し読んで、何か不足していないかどうかを確認してください。
于 2009-04-26T04:49:09.680 に答える
3

使用している多くのシステム コールからのエラーをチェックしていないようです。たとえばGetFileVersionInfo、データの取得中にエラーが発生した場合は 0 を返します。その時点で呼び出しGetLastErrorて、特定のエラーの原因を調べることができます。同様にGetFileVersionInfoSize、エラーが発生した場合は 0 を返します。その失敗をチェックしているように見えますが、わざわざシステム エラー コードをログに記録しないでください (再度、GetLastErrorその値を取得するために使用します)。

使用しているシステム コールのエラー処理コードを追加することをお勧めします。ほとんどの場合、そのうちの 1 つが失敗しており、おそらく非常に意味のあるエラー コードが残っているため、GetLastError.

于 2009-04-26T04:44:57.770 に答える
0

nvm。それが答えられない場合、Stackoverflowは私を打ち負かすようです.....

ビリー3

于 2009-05-18T03:35:38.820 に答える