Получаването на информация за версията на файла е неуспешно, но не и за мен

Опитвам се да получа информация за версията от файл. Моят код работи перфектно за мен, но се проваля на машини на няколко други. Тъй като не мога да възпроизведа грешката, имам доста време да открия проблема.

Някой вижда ли нещо лошо в това?

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

nvm. Изглежда, че Stackoverflow ме бие по дяволите, ако не се отговори.....

Били3

person Community    schedule 18.05.2009