Ошибка получения информации о версии файла, но не для меня

Я пытаюсь получить информацию о версии из файла. Мой код отлично работает для меня, но не работает на нескольких других машинах. Поскольку я не могу воспроизвести ошибку, у меня довольно много времени на поиск проблемы.

Кто-нибудь видит в этом что-то серьезное?

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


person Community    schedule 26.04.2009    source источник
comment
Прошу прощения... оказывается, все жалующиеся пользователи использовали старую копию программы, в которой еще не была реализована эта функция. Спасибо!   -  person Billy ONeal    schedule 28.04.2009


Ответы (3)


Попробуйте следующее:

  • Узнайте причину сбоя GetFileVersion с помощью GetLastError
  • Расскажите, на какой ОС работает, а на какой нет.
  • Проверить успешность GetFileVersionInfo или нет (снова GetLastError)
  • Несколько раз прочитайте раздел Примечания документации MSDN по вышеупомянутым функциям и проверьте, не упустили ли вы что-то.
person dirkgently    schedule 26.04.2009

Похоже, вы не проверяете ошибки многих системных вызовов, которые вы используете. Например, GetFileVersionInfo вернет ноль, если при получении данных произошла ошибка, и в этот момент вы можете вызвать GetLastError, чтобы узнать, в чем заключалась конкретная ошибка. Аналогично, GetFileVersionInfoSize вернет ноль в случае ошибки. Похоже, вы проверяете этот сбой, но не утруждаете себя записью кода системной ошибки (опять же, используйте GetLastError для получения этого значения).

Я предлагаю вам добавить код обработки ошибок для системных вызовов, которые вы используете. Скорее всего, один из них дает сбой и, вероятно, оставляет очень значимый код ошибки, который вы можете проверить с помощью GetLastError.

person Eric Melski    schedule 26.04.2009

нвм. Кажется, Stackoverflow выбивает меня из колеи, если на него не отвечают.....

Билли3

person Community    schedule 18.05.2009