Вопрос пользователя заключается в том, что ему необходимо добавить информацию о версии для исполняемых файлов (EXE), которые изначально не содержат такую информацию. Попытки использовать функции BeginUpdateResource, UpdateResource и EndUpdateResource привели к созданию некорректных данных, вместо ожидаемой информации о версии.
Подтвержденный ответ:
Пользователь предоставил код, который он использует для обновления информации о версии, но он не достигает желаемого результата, так как создаёт некорректные данные. Необходимо создать структуру VERSIONINFO, заполнить её информацией и скопировать в ресурсы исполняемого файла.
Альтернативный ответ:
Ресурс RT_VERSION не просто восемь байт. Это VERSIONINFO, структура с фиксированным размером и переменными строками. Для деталей можно обратиться к документации MSDN по VERSIONINFO resource.
Решение проблемы:
Для решения проблемы можно использовать следующий код на Object Pascal (Delphi), который добавляет или обновляет числовые версии исполняемых файлов, используя существующий ресурс версии из другого файла:
type
VERSIONHEADER = packed record
wLength: word;
wValueLength: word;
wType: word;
Key: array[0..16] of WideChar; // 'VS_VERSION_INFO'
Version: VS_FIXEDFILEINFO;
end;
var
ToolPath: TFileName; // = exe содержащий ссылку на версию ресурса
ExeFullPath: TFileName; // = целевой exe
Maj, Min: cardinal; // ожидаемый обновлённый номер версии
VersionHandle, VersionRes: THandle;
VersionSize: DWORD;
Version: array of AnsiChar;
Ver: ^VERSIONHEADER;
VersionSize := GetFileVersionInfoSize(pointer(ToolPath), VersionHandle);
if (VersionSize <> 0) and (Maj <> 0) then
begin
SetLength(Version, VersionSize);
Ver := pointer(Version);
GetFileVersionInfo(pointer(ToolPath), 0, VersionSize, Ver);
if Ver^.Version.dwSignature = $FEEDF04BD then
begin
Ver^.Version.dwFileVersionMS := MAKELONG(Min, Maj);
Ver^.Version.dwProductVersionMS := Ver^.Version.dwFileVersionMS;
VersionRes := BeginUpdateResource(Pointer(ExeFullPath), False);
UpdateResource(VersionRes, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO),
1033, Ver, VersionSize);
EndUpdateResource(VersionRes, False);
end;
end;
Этот код позволяет добавить или обновить числовые версии исполняемого файла (ExeFullPath), заменив их ресурсом версии из другого файла (ToolPath), который может быть, например, общим ресурсом с информацией о версии, или даже самим целевым файлом для обновления номеров версий.
Примечание:
Код выше является упрощённым примером. Для полноценной работы с информацией о версии необходимо учитывать различные аспекты, такие как локализация, различные типы строк и другие детали, которые определяются структурой VERSIONINFO.
Заключение:
Для успешного добавления информации о версии в исполняемые файлы на Delphi важно правильно организовать структуру VERSIONINFO, корректно заполнить её необходимыми данными и выполнить запись в ресурсы целевого файла. Используя предоставленный пример кода, можно начать работу с версионной информацией в своих проектах на Delphi.
Как добавить информацию о версии в исполняемые файлы на Delphi, пошаговое руководство с учетом корректного использования структуры `VERSIONINFO`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.