Sign in Join
Wiki copytemporary

Show Application Title, Version, and Company/ru

English · Русский

Обзор

Windows

С самых ранних версий Microsoft Windows имела возможность хранить информацию о версии и т.д. в исполняемом файле. Поддержка этого была добавлена в Delphi в районе v3 и частично работала в Lazarus 0.9.24.

Linux

В формате файла ELF нет неявных положений о номерах версий, авторских правах и так далее, но Lazarus хранит это в разделах ресурсов. Чтение информации во время исполнения программы зависит от модулей FPC, ниже - некоторая полезная информация.

macOS и iOS

Для macOS информация о версии файла Lazarus может храниться в двух местах:

Реализации

FPC 3.0

Реализация в FPC 3.0.x с использованием fcl-res: см. announcement in User Changes 3.0

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

pascal
program printfileinfo;
{Отображает информацию о версии файла для 
- исполняемых файлов Windows PE 
- исполняемых Linux ELF (скомпилированных в Lazarus)
- исполняемых файлов MACH-O OSX (скомпилированных в Lazarus)
Запускается на Windows, Linux, OSX...
}

{$mode objfpc}{$H+}
{$ifdef mswindows}{$apptype console}{$endif}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes,sysutils
  // FPC 3.0 fileinfo читает ресурсы exe, пока вы регистрируете соответствующие модули
  , fileinfo
  , winpeimagereader {это нужно для чтения информации exe}
  , elfreader {необходимо для чтения исполняемых файлов ELF}
  , machoreader {необходимо для чтения исполняемых файлов MACH-O}
  ;

var
  FileVerInfo: TFileVersionInfo;

{$R *.res}

begin
  FileVerInfo:=TFileVersionInfo.Create(nil);
  try
    FileVerInfo.ReadFileInfo;
    writeln('Company: ',FileVerInfo.VersionStrings.Values['CompanyName']);
    writeln('File description: ',FileVerInfo.VersionStrings.Values['FileDescription']);
    writeln('File version: ',FileVerInfo.VersionStrings.Values['FileVersion']);
    writeln('Internal name: ',FileVerInfo.VersionStrings.Values['InternalName']);
    writeln('Legal copyright: ',FileVerInfo.VersionStrings.Values['LegalCopyright']);
    writeln('Original filename: ',FileVerInfo.VersionStrings.Values['OriginalFilename']);
    writeln('Product name: ',FileVerInfo.VersionStrings.Values['ProductName']);
    writeln('Product version: ',FileVerInfo.VersionStrings.Values['ProductVersion']);
  finally
    FileVerInfo.Free;
  end;
end.

Реализации с использованием устаревшего FPC 2.6.x

Использует fcl-res; вклад через список рассылки: 1

Используйте это как

pascal
uses
  resource, versiontypes, versionresource;

 FUNCTION resourceVersionInfo: STRING;
 
 (* В отличие от большинства AboutText (см.ниже), это требует значительных усилий  *)
 (* во время выполнения программы для извлечения номеров версий/выпусков/сборок из *)
 (* информации о ресурсах, добавленной в двоичный файл.                            *)
 
 VAR     Stream: TResourceStream;
         vr: TVersionResource;
         fi: TVersionFixedInfo;
 
 BEGIN
   RESULT:= '';
   TRY
 
 (* Это вызывет исключение, если информация о версии не была включена в двоичный *)
 (* файл (Lazarus Project -> Project Options -> Version Info -> Version           *)
 (* numbering).                                                                   *)

     Stream:= TResourceStream.CreateFromID(HINSTANCE, 1, PChar(RT_VERSION));
     TRY
       vr:= TVersionResource.Create;
       TRY
         vr.SetCustomRawDataStream(Stream);
         fi:= vr.FixedInfo;
         RESULT := 'Version ' + IntToStr(fi.FileVersion[0]) + '.' + IntToStr(fi.FileVersion[1]) +
                ' release ' + IntToStr(fi.FileVersion[2]) + ' build ' + IntToStr(fi.FileVersion[3]) + eol;
         vr.SetCustomRawDataStream(nil)
       FINALLY
         vr.Free
       END
     FINALLY
       Stream.Free
     END
   EXCEPT
   END
 END { resourceVersionInfo } ;

Использоаавние vinfo: здесь и здесь

Советы по теме

Ревизии SVN/Git/Hg/Mercurial

Используйте $(lazarusdir)/tools/svn2revisioninc для получения номера ревизии (из репозиториев subversion, git или mercurial) в файле revision.inc, например что-то вроде:

pascal
// Создан при помощи Svn2RevisionInc
const RevisionStr = '43594';

Хаки только для Unix-систем

Они работают с Linux на различных платформах и, вероятно, с Solaris при условии, что установлены утилиты, производные от GNU.

Получение информации о версии Subversion в виде строки, доступной для программы

Вставьте это в Project options -> Compilation -> Execute before -> Command:

bash
 /bin/sh -c "echo -n C`svnversion -n`C |tr A-G %-+ >project_svnrevision.inc"

Note quote and backtick positions. The tr is converting C into another layer of quotes which is necessary for things to work as required. Обратите внимание на кавычки и обратные кавычки. Tr преобразует C в другой уровень цитат, который необходим для того, чтобы все работало должным образом.

Поместите это в программу:

pascal
   (*$IFDEF UNIX   *)
           rev= (*$I project_svnrevision.inc *) ;
   (*$ELSE         *)
           rev= 'unimplemented';
   (*$ENDIF        *)

Обратите внимание, что это должна быть строка, так как номер версии будет иметь нечисловой суффикс, если проект был обновлен с момента его последней фиксации.

Переименование окончательного исполняемого файла, чтобы включить в его название платформу и метку времени

Вставьте это в Project options -> Paths -> Unit output directory:

bash
 lib/$(TargetCPU)-$(TargetOS)

Вставьте это в Project options -> Paths -> Target file name:

bash
 UnyokedBackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)

Убедитесь, что установлена галочка "Apply conventions"(Применить соглашения). Это может немного отличаться в зависимости от версии IDE и компилятора/компоновщика.

Вставьте это в Project options -> Compilation -> Execute after -> Command:

bash
 /bin/sh -c "mv libunyokedbackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType).so UnyokedBackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType).`date +%F.%R`.so"

Это должна быть одна строка. Обратите внимание на кавычки и обратные кавычки.


From the Free Pascal wiki, page "Show Application Title, Version, and Company/ru", as it stood on 2020-08-18 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 1, last changed by Zoltanleo .

Edited on wiki.freepascal.org by 1 person, 2020

From the official wiki's backup of 26 May 2024: who edited this page there, and when. Edits made there after that date were not recorded, and the earlier versions are not shown here; the main page says why.

WhenWhoWhat changed
ZoltanleoCreated page
ZoltanleoLinux
ZoltanleomacOS and iOS
ZoltanleoImplementations
ZoltanleoРеализации с использованием устаревшего FPC 2.6.x
ZoltanleoRelated tips
ZoltanleoUnix-only hacks

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.