Извлечение блоков VERSIONINFO::StringFileInfoC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Извлечение блоков VERSIONINFO::StringFileInfo

Сообщение Anonymous »

Если вы создаете двоичный файл Windows, вы можете написать файл .rc, подобный следующему:

Код: Выделить всё

// Version information resource file
#include "windows.h"

1 VERSIONINFO
FILEVERSION 1, 2, 3, 4
FILEOS 0x00000004L  // VOS_WINDOWS32 (32-bit Windows)
FILETYPE VFT_APP
{
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0809, 0x04E4
// 0x0809 = Locale ID: English (United Kingdom)
// 0x04E4 = Code page: 1252 (Multilingual)
}

BLOCK "StringFileInfo"
{
// Note: The block address is a concatenation of the locale ID and code page
BLOCK "080904E4"
{
VALUE "CompanyName", "MyCompanyName\0"
}
}
}
Это компилируется в файл .res, который связывается с окончательным двоичным файлом. В Windows вы можете щелкнуть правой кнопкой мыши двоичный файл, чтобы просмотреть информацию о версии.
Следующий код Delphi демонстрирует извлечение строки версии. Это можно адаптировать к другому языку, например C++ или C#.

Код: Выделить всё

procedure TMyApp.GetFileVersionString();
var
path, versionString: String;
versionSize, versionLength: DWORD;
pstrBuffer, pstrValue: PAnsiChar;
begin
// Extract Windows version information from a binary
versionString := '';
path := 'c:\path\to\someBinary.exe';
if (FileExists(path)) then
begin
versionSize := GetFileVersionInfoSize(PAnsiChar(path), versionSize);
if (versionSize > 0) then
begin
pstrBuffer := AllocMem(versionSize);
try
// Query values in StringFileInfo block "080904E4":
// * Locale = English (United Kingdom) [0x0809]
// * Code page = 1252 (Multilingual) [0x04E4]
// Note: The default "English (United States)" locale would be "040904E4"
GetFileVersionInfo(PAnsiChar(path), 0, versionSize, pstrBuffer);
if (VerQueryValue(
pstrBuffer,
PAnsiChar('StringFileInfo\080904E4\CompanyName'),
Pointer(pstrValue), versionLength)) then
begin
pstrValue := PAnsiChar(Trim(pstrValue));
if (Length(pstrValue) > 0) then
versionString := pstrValue // "MyCompanyName"
else
; // Version info string is empty (i.e. not set)
end
else
begin
// Version info string not present in VersionInfo::StringFileInfo block
// or you are looking at the wrong block
end;
finally
FreeMem(pstrBuffer, dwSize);
end;

end
else
; // File does not contain FileVersionInfo resource
end;
end;
Локальным стандартом по умолчанию является «Английский (США)», тогда как вместо этого нужно искать блок «040904E4».
Мой вопрос: как чтобы без предварительного знания определить, какие блоки (например, «080904E4» или «040904E4») доступны в разделе VersionInfo::StringFileInfo? C/C++, Delphi или любой другой язык подойдет.

Подробнее здесь: https://stackoverflow.com/questions/792 ... nfo-blocks
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»