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通过使用检索 's 失败的原因GetLastError
  • 告诉我们它在什么操作系统上运行,在什么操作系统上不运行
  • 检查是否GetFileVersionInfo成功(再次GetLastError
  • 反复阅读上述功能的 MSDN 文档的备注部分,并检查您是否没有遗漏任何内容。
于 2009-04-26T04:49:09.680 回答
3

看起来您没有检查您正在使用的许多系统调用的错误。例如,GetFileVersionInfo如果获取数据时出错,将返回零,此时您可以调用GetLastError以找出具体的故障是什么。同样,GetFileVersionInfoSize如果有错误,将返回零。看起来您检查了该故障,但不费心记录系统错误代码(再次,用于GetLastError检索该值)。

我建议您为正在使用的系统调用添加错误处理代码。其中一个很可能失败了,并且可能会留下一个非常有意义的错误代码供您使用GetLastError.

于 2009-04-26T04:44:57.770 回答
0

非易失性。如果没有回答,似乎 Stackoverflow 会让我大吃一惊.....

比利3

于 2009-05-18T03:35:38.820 回答