Difference between revisions of "Show Application Title, Version, and Company/ru"
Line 13: | Line 13: | ||
* комплект приложения (если он есть) в plist. См. [[Mac Show Application Title, Version, and Company]] для получения дополнительной информации. | * комплект приложения (если он есть) в plist. См. [[Mac Show Application Title, Version, and Company]] для получения дополнительной информации. | ||
− | == | + | == Реализации == |
=== FPC 3.0 === | === FPC 3.0 === | ||
− | + | Реализация в FPC 3.0.x с использованием [[fcl-res]]: см. [[http://wiki.lazarus.freepascal.org/User_Changes_3.0#TVersionInfo_.28fileinfo_unit.29_re-implemented_in_a_platform_independent_way| announcement in User Changes 3.0]] | |
− | + | В приведенном ниже коде показано, как получить информацию об исполняемых файлах из | |
− | * .exe/.dll/.ocx | + | * .exe/.dll/.ocx (формат Windows) файлов |
− | * Lazarus | + | * исполняемых файлов ELF, скомпилированных в Lazarus (Linux), |
− | * | + | * исполняемых файлов MACH-O, скомпилированных в Lazarus (OSX) |
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
program printfileinfo; | program printfileinfo; | ||
− | { | + | {Отображает информацию о версии файла для |
− | - Windows PE | + | - исполняемых файлов Windows PE |
− | - Linux ELF | + | - исполняемых Linux ELF (скомпилированных в Lazarus) |
− | - | + | - исполняемых файлов MACH-O OSX (скомпилированных в Lazarus) |
− | + | Запускается на Windows, Linux, OSX... | |
} | } | ||
Line 38: | Line 38: | ||
{$ENDIF}{$ENDIF} | {$ENDIF}{$ENDIF} | ||
Classes,sysutils | Classes,sysutils | ||
− | // FPC 3.0 fileinfo | + | // FPC 3.0 fileinfo читает ресурсы exe, пока вы регистрируете соответствующие модули |
, fileinfo | , fileinfo | ||
− | , winpeimagereader { | + | , winpeimagereader {это нужно для чтения информации exe} |
− | , elfreader { | + | , elfreader {необходимо для чтения исполняемых файлов ELF} |
− | , machoreader { | + | , machoreader {необходимо для чтения исполняемых файлов MACH-O} |
; | ; | ||
Line 68: | Line 68: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | === | + | === Реализации с использованием устаревшего FPC 2.6.x === |
− | + | Использует [[fcl-res]]; вклад через список рассылки: [http://lists.lazarus.freepascal.org/pipermail/lazarus/attachments/20100723/8db6b97e/attachment.ksh] | |
Use this like | Use this like | ||
Line 116: | Line 116: | ||
Using vinfo: [http://forum.lazarus.freepascal.org/index.php?topic=12435.0] and [http://forum.lazarus.freepascal.org/index.php?topic=13957.0] | Using vinfo: [http://forum.lazarus.freepascal.org/index.php?topic=12435.0] and [http://forum.lazarus.freepascal.org/index.php?topic=13957.0] | ||
− | |||
− | |||
== Related tips == | == Related tips == |
Revision as of 15:50, 17 August 2020
│ 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]
Use this like
uses
resource, versiontypes, versionresource;
FUNCTION resourceVersionInfo: STRING;
(* Unlike most of AboutText (below), this takes significant activity at run- *)
(* time to extract version/release/build numbers from resource information *)
(* appended to the binary. *)
VAR Stream: TResourceStream;
vr: TVersionResource;
fi: TVersionFixedInfo;
BEGIN
RESULT:= '';
TRY
(* This raises an exception if version info has not been incorporated into the *)
(* binary (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 } ;
Related tips
SVN/Git/Hg/Mercurial revision
Use $(lazarusdir)/tools/svn2revisioninc to get revision number (from a subversion, git or mercurial repository) into a file revision.inc, e.g. something like:
// Created by Svn2RevisionInc
const RevisionStr = '43594';
Unix-only hacks
These work with Linux on various platforms, and probably with Solaris provided that the GNU-derived utilities are installed.
Getting Subversion revision information as a program-accessible string
Put this into 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.
Put this into the program:
(*$IFDEF UNIX *)
rev= (*$I project_svnrevision.inc *) ;
(*$ELSE *)
rev= 'unimplemented';
(*$ENDIF *)
Note that that has to be a string, since the revision number will have a non-numeric suffix if the project has been updated since it was last committed.
Renaming the final executable to include platform and timestamp
Put this into Project options -> Paths -> Unit output directory:
lib/$(TargetCPU)-$(TargetOS)
Put this into Project options -> Paths -> Target file name:
UnyokedBackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)
Make sure that "Apply conventions" is ticked (checked). This might vary slightly according to IDE and compiler/linker versions.
Put this into Project options -> Compilation -> Execute after -> Command:
/bin/sh -c "mv libunyokedbackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType).so UnyokedBackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType).`date +%F.%R`.so"
That should be a single line. Note quote and backtick positions.