Главная :: Программы для программирования :: Lazarus :: Как получить информацию об исполняемом файле в Lazarus
Ваши руки выполнили недопустимую операцию и будут ампутированы

Как получить информацию об исполняемом файле в Lazarus

В этой статье мы обсудим как добавлять и извлекать информацию в исполняемом файле в Lazarus.

Одним из примеров, когда это может понадобиться, является динамическое отображение номера сборки в приложении. Средства Lazarus, начиная с версии 0.9.6, позволяют это сделать (в предыдущей стабильной версии эта функция работала неправильно, что приводило к ошибке выполнения программы).

В качестве примера создадим консольное приложение (хотя те же действия можно сделать в любом другом типе приложений). Сначала включим подключение информации в исполняемый файл проекта. Выбираем в меню ПроектПараметры проектаИнформация о версии. Во вкладке ставил флажки напротив пунктов "Добавлять информацию о версии в исполняемый файл" и "Автоматически наращивать номер сборки". Первый пункт означает, что информация будет добавляться на этапе компиляции в файл проекта (через файл ресурсов *.rc). Второй параметр означает, что при каждой компиляции номер сборки автоматически увеличивается на единицу. Без вопросов, удобная функция.

Заполняем в той же вкладке основную информацию. Можно добавить дополнительную информацию перейдя по кнопке Дополнительно. Отметим, что если оставить последнее поле (Версия продукта) пустой, то при компиляции это поле принимает значение текущей версии сборки. При дальнейших компиляциях это поле остается без изменений (если нужно его обновить, например, при финальной компиляции релиз-версии, то очищаем его и компилируем по новой). Данное тайное знание добавляет нам сил и расширяет поле для маневров.

Как теперь проверить, что информация добавляется в исполняемый файл? В любом файловом менеджере просматриваем свойства нашего исполняемого файла. Например, в проводнике (если кто пользуется), щелкаем правой кнопкой мыши по нашему файлу и выбираем Свойства. Видим название файла и описание. Остальная информация находится в закладке Версия.

Теперь перейдем к самому интересному. Напишем программу, которая будет читать эту информацию из любого исполняемого файла (если, конечно, эта информация там есть). Нам в этом поможет модуль FileInfo из FCL (Free Component Library). Этот модуль содержится в стандартной поставке Lazarus, так что проблем не должно быть. Пишем в секцию модулей:

uses FileInfo;

В основной программе описываем переменные:

i: Integer;
Version: TFileVersionInfo;
MyFile, MyVersion: String; 

За извлечение информации из бинарника отвечает TFileVersionInfo, остальные переменные являются служебными. Создаем класс Version и связываем его с именем исполняемого файла. Мы сделали проверку на наличие первого входного параметра. Если он задан, то рассматривается как имя внешнего исполняемого файла. Если же программа запускается без параметров, то берем имя нашей программы из нулевого параметра (в этом параметре всегда идет имя исполняемого файла).

Version:=TFileVersionInfo.create(Nil);
If (paramstr(1) <> '') then
   MyFile:=paramstr(1)
else
  MyFile:=paramstr(0);
Version.fileName:=MyFile;

Зачитываем информацию и выводим ее на консоль:

WriteLn(MyFile+' information');
WriteLn('------------------------------------');
With Version do begin
  For i:=0 to VersionStrings.Count-1 do begin
    If VersionCategories[I]='FileVersion' then
      MyVersion := VersionStrings[i];
    WriteLn('['+VersionCategories[I]+']'+'='+VersionStrings[i]);
  end;
end;
Version.Free;

Отметим, следующие моменты. Во-первых, вы выделили номер сборки в отдельную переменную FileVersion, т.к. обычно это наиболее востребованная информация. Во-вторых, информацию можно выводить куда угодно, например в метку (в оконном приложении): Label1.Caption := 'Сборка: '+MyVersion;.

Добавим еще несколько строчек в конце (вывод номера сборки) и поставим паузу, чтобы консольное окно автоматически не закрывалось (программа завершится при нажатии клавиши Enter).

WriteLn('------------------------------------');
WriteLn('Here app version info: '+MyVersion);
WriteLn('Press "Enter" to exit');
ReadLn();

Теперь запускаем, исправляем лаги, запускаем еще раз и смотрим, что получилось. У вас результат будет несколько отличным от моего (разные компьютеры, разные версии ОС, разные судьбы).

Результат выполнения программы при запуске без параметров:

>fileinfo
D:\Temp\FileInfo\FileInfo.exe information
------------------------------------
[CompanyName]=fsweb.info
[FileDescription]=This is file app version info example
[FileVersion]=0.0.0.22
[InternalName]=FileInfoExample
[LegalCopyright]=Ildar Nasibullayev
[OriginalFilename]=FileInfo
[ProductName]=FileInfo
[ProductVersion]=0.0.0.21
------------------------------------
Here app version info: 0.0.0.22
Press "Enter" to exit

Запуск программы с параметром (указан путь и имя для стандартного калькулятора):

>fileinfo C:\WINDOWS\system32\calc.exe
C:\WINDOWS\system32\calc.exe information
------------------------------------
[CompanyName]=Microsoft Corporation
[FileDescription]=Windows Rechner
[FileVersion]=5.1.2600.0 (xpclient.010817-1148)
[InternalName]=CALC
[LegalCopyright]=? Microsoft Corporation. Alle Rechte vorbehalten.
[OriginalFilename]=CALC.EXE
[ProductName]=Betriebssystem Microsoft? Windows?
[ProductVersion]=5.1.2600.0
------------------------------------
Here app version info: 5.1.2600.0 (xpclient.010817-1148)
Press "Enter" to exit

Если что-то не получилось, можете скачать мою версию программы с исходниками здесь (66.97 Кб).

Для написания статьи использовался компилятор FPC 2.2.2 и оболочка Lazarus 0.9.6.

Автор: Ильдар Насибуллаев