winapi — программно получить ProductVersion из .exe с помощью API GetFileVersionInfo (C ++)

Ссылка на это ответ Я пытаюсь получить ProductVersion с Windows Api, используя GetFileVersionInfo метод. Проблема в том, что через свойства .exe ProductVersion виден, но программно я получаю только «0.0.0.0».

.exe свойства:

exe свойства

выход:

выход:

Код:

                printf( "File Version 1: %d.%d.%d.%d\n",
( verInfo->dwFileVersionMS >> 16 ) & 0xffff,
( verInfo->dwFileVersionMS >>  0 ) & 0xffff,
( verInfo->dwFileVersionLS >> 16 ) & 0xffff,
( verInfo->dwFileVersionLS >>  0 ) & 0xffff
);

printf( "File Version 2: %d.%d.%d.%d\n",
( verInfo->dwFileVersionLS >> 24 ) & 0xff,
( verInfo->dwFileVersionLS >> 16 ) & 0xff,
( verInfo->dwFileVersionLS >>  8 ) & 0xff,
( verInfo->dwFileVersionLS >>  0 ) & 0xff
);printf( "Product Version 1: %d.%d.%d.%d\n",
( verInfo->dwProductVersionLS >> 24 ) & 0xff,
( verInfo->dwProductVersionLS >> 16 ) & 0xff,
( verInfo->dwProductVersionLS >>  8 ) & 0xff,
( verInfo->dwProductVersionLS >>  0 ) & 0xff
);

printf( "Product Version 2: %d.%d.%d.%d\n",
(verInfo->dwProductVersionMS >> 16) & 0xffff,
(verInfo->dwProductVersionMS >>  0) & 0xffff,
(verInfo->dwProductVersionLS >> 16) & 0xffff,
(verInfo->dwProductVersionLS >>  0) & 0xffff
);

printf( "Product Version 3: %d.%d.%d.%d\n",
(verInfo->dwProductVersionMS >> 16) & 0xffff,
(verInfo->dwProductVersionMS >>  8) & 0xffff,
(verInfo->dwProductVersionLS >> 16) & 0xffff,
(verInfo->dwProductVersionLS >>  8) & 0xffff
);

Вопрос — WTF? Как получить ProductVersion, и как ребята из Microsoft сделали это?

1

Решение

Информационный ресурс версии содержит небольшую фиксированную часть (VS_FIXEDFILEINFO) и, возможно, некоторые строки.

Некоторые приложения отображают числа из фиксированной части, а некоторые используют строки FileVersion / ProductVersion.

Возможно, вам следует использовать строку, если она присутствует, потому что она позволяет разработчику добавлять дополнительные фрагменты информации, такие как альфа / бета-версия и т. Д., И потому, что некоторые люди забывают правильно установить правильную версию в фиксированной части.

Использовать VerQueryValue функция, чтобы получить список языков и строк …

1

Другие решения

Вот фрагмент кода для тех, кто также пытается получить ProductVersion:

if (!VerQueryValue (lpData, TEXT("\\StringFileInfo\\040904E4\\ProductVersion"),
(LPVOID) &lpBuffer, (PUINT) &BufLen)) {
/* language ID 040904E4: U.S. English, char set = Windows, Multilingual */
printf ("ProductVersion:       not found\n");
}
else
printf ("ProductVersion:       %s\n", lpBuffer);

Вот Полный код.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector