Show Application Title, Version, and Company/ru

From Free Pascal wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

English (en) русский (ru)

Обзор

Windows

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

Linux

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

macOS и iOS

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

  • исполняемый файл MACH-O (например, в Windows, Linux); см. ниже
  • комплект приложения (если он есть) в plist. См. Mac Show Application Title, Version, and Company для получения дополнительной информации.

Реализации

FPC 3.0

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

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

  • .exe/.dll/.ocx (формат Windows) файлов
  • исполняемых файлов ELF, скомпилированных в Lazarus (Linux),
  • исполняемых файлов MACH-O, скомпилированных в Lazarus (OSX)
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]

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

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, например что-то вроде:

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

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

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

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

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

 /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 в другой уровень цитат, который необходим для того, чтобы все работало должным образом.

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

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

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

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

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

 lib/$(TargetCPU)-$(TargetOS)

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

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

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

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

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

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