Не получается получить информацию о версии файла - но не для меня - PullRequest
0 голосов
/ 26 апреля 2009

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

Кто-нибудь видит в этом что-то не так?

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;
};

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

Есть идеи?

Billy3

Ответы [ 3 ]

4 голосов
/ 26 апреля 2009

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

  • Получите причину сбоя GetFileVersion, используя GetLastError
  • Скажите нам, на какой ОС он работает, а на какой нет
  • Проверьте, успешно ли GetFileVersionInfo или нет (снова GetLastError)
  • Прочтите раздел Замечания документации MSDN по вышеперечисленным функциям и проверьте, не пропустили ли вы что-нибудь.
3 голосов
/ 26 апреля 2009

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

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

0 голосов
/ 18 мая 2009

NVM. Кажется, Stackoverflow превосходит меня, если он не отвечает .....

Billy3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...