Проблема получения полного номера версии для Windows 10 с GetFileVersionInfo и VerQueryValue - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу получить полный номер версии для Windows, так же, как это делает CMD:

Full version number from console

Я закончил с этим MS doc, в котором указано:

Чтобы получить полный номер версии операционной системы, вызовите функцию GetFileVersionInfo в одной из системных библиотек DLL, например Kernel32.dll, а затем вызовите VerQueryValue, чтобы получить \StringFileInfo \\ ProductVersion - субблок информации о версии файла.

Поэтому я попытался использовать эти функции с этим кодом:

#include <Windows.h>
#include <wchar.h>

#pragma comment(lib, "Mincore.lib")

int wmain(int argc, wchar_t* argv[])
{
    // GetFileVersionInfoW
    LPCWSTR fileName = L"C:\\Windows\\System32\\kernel32.dll";
    DWORD fileInfoSize;

    fileInfoSize = GetFileVersionInfoSizeW(fileName, NULL);

    if (fileInfoSize == 0)
    {
        fwprintf(stderr, L"\nError code: %u\n", GetLastError());
        return;
    }

    // GetFileVersionInfoW
    VOID* pFileVerInfo = malloc(fileInfoSize);

    if (pFileVerInfo == NULL)
    {
        fwprintf(stderr, L"Failed allocating!\n");
        return;
    }

    if (!GetFileVersionInfoW(fileName, 0, fileInfoSize, pFileVerInfo))
    {
        fwprintf(stderr, L"Error code: %u\n", GetLastError());
        free(pFileVerInfo);
        return;
    }

    // VerQueryValueW
    LPCWSTR subBlock = L"\\StringFileInfo\\\\ProductVersion";
    VS_FIXEDFILEINFO * pFileInfo;
    UINT pLen = 0;

    if (!VerQueryValueW(pFileVerInfo, subBlock, (LPVOID*)& pFileInfo, &pLen))
    {
        fwprintf(stderr, L"Error code: %u\n", GetLastError());
        return;
    }


    return 0;
}

Однако функция VerQueryValueW не работает с кодом1813 и я понятия не имею, почему.Я также понятия не имею, как я могу показать полную версию после вызова функции.

Вы можете мне помочь?

1 Ответ

0 голосов
/ 01 февраля 2019

L"\\StringFileInfo\\\\ProductVersion" неверно.В середине должен быть идентификатор языка.В моей установке Windows 10 рабочая строка: L"\\StringFileInfo\\040904B0\\ProductVersion".Но, возможно, это будет отличаться в других системах.

Как предложил Джонатан Поттер в комментариях, вы можете найти идентификатор, запросив \\VarFileInfo\\Translation.


Более простые варианты для достижения цели включают:

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