Получить файл Описание приложения VerQueryValue - PullRequest
0 голосов
/ 02 ноября 2018

Я действительно путаю с этой функцией. В настоящее время я успешно получаю версию файла и версию продукта. Теперь я хочу получить больше информации в приложении. как FileDescription и CompanyName.

DWORD dwLen;
VS_FIXEDFILEINFO    *pFileInfo;
UINT                pLenFileInfo;

dwLen = GetFileVersionInfoSize("D:/firefox.exe", NULL);

BYTE *sKey = new BYTE[dwLen];

GetFileVersionInfo("D:/firefox.exe", NULL, dwLen, sKey);

VerQueryValue(sKey, "\\", (LPVOID*)&pFileInfo, &pLenFileInfo);

// at now i can retrieve file Version with structure VS_FIXEDFILEINFO

VerQueryValue(sKey, "\\StringFileInfo\\%04x%09x\\FileDescription", (LPVOID*) &pFileInfo, &pLenFileInfo);

delete[] sKey;

cout << pFileInfo;

// it return address buffer `00230428`;

как именно вернуть описание файла Firefox? что за структура для получения описания файла в параметре 3 LPVOID? в моем коде я передаю pFileInfo дважды в VerQueryValue

Новое редактирование

    DWORD dwLen;

    struct LANGANDCODEPAGE {
            WORD wLanguage;
            WORD wCodePage;
        } *lpTranslate;

    dwLen = GetFileVersionInfoSize("D:/firefox.exe", NULL);

        BYTE *sKey = new BYTE[dwLen];
TCHAR *sCompanyName = new char[1024];

        GetFileVersionInfo("D:/firefox.exe", NULL, dwLen, sKey);

    VerQueryValue(sKey, "\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &pLenFileInfo);

VerQueryValue(test, "\\StringFileInfo\\%04x%09x\\FileDescription", (LPVOID*)&sCompanyName, &pLenFileInfo);

delete[] sKey;

cout << lpTranslate -> wLanguage;

1 Ответ

0 голосов
/ 02 ноября 2018
VerQueryValue(test, "\\StringFileInfo\\%04x%09x\\FileDescription",
   (LPVOID*)&sCompanyName, &pLenFileInfo);

Второй параметр должен иметь этот формат "\\StringFileInfo\\NxM\\FileDescription", где N и M равны wLanguage и wCodePage. Следуя примеру в разделе комментариев, вы можете использовать "%04x%04x" в качестве спецификатора формата печати для создания строки. Пример:

BOOL foo()
{
    const char* filename = "c:\\windows\\hh.exe";
    int dwLen = GetFileVersionInfoSize(filename, NULL);
    if(!dwLen)
        return 0;

    auto *sKey = new BYTE[dwLen];
    std::unique_ptr<BYTE[]> skey_automatic_cleanup(sKey);
    if(!GetFileVersionInfo(filename, NULL, dwLen, sKey))
        return 0;

    struct LANGANDCODEPAGE {
        WORD wLanguage;
        WORD wCodePage;
    } *lpTranslate;

    UINT cbTranslate = 0;
    if(!VerQueryValue(sKey, "\\VarFileInfo\\Translation",
        (LPVOID*)&lpTranslate, &cbTranslate))
        return 0;

    for(unsigned int i = 0; i < (cbTranslate / sizeof(LANGANDCODEPAGE)); i++)
    {
        char subblock[256];
        //use sprintf if sprintf_s is not available
        sprintf_s(subblock, "\\StringFileInfo\\%04x%04x\\FileDescription",
            lpTranslate[i].wLanguage, lpTranslate[i].wCodePage);
        char *description = NULL;
        UINT dwBytes;
        if(VerQueryValue(sKey, subblock, (LPVOID*)&description, &dwBytes))
            MessageBox(0, description, 0, 0);
    }
    return TRUE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...