Show Application Title, Version, and Company/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Show Application Title, Version, and Company/ru
| Old | New | Line | |
|---|---|---|---|
| 1 | + | ## Обзор | |
| 2 | + | ||
| 3 | + | ### Windows | |
| 4 | + | ||
| 5 | + | С самых ранних версий Microsoft Windows имела возможность хранить информацию о версии и т.д. в исполняемом файле. Поддержка этого была добавлена в Delphi в районе v3 и частично работала в Lazarus 0.9.24. | |
| 6 | + | ||
| 7 | + | ### Linux | |
| 8 | + | ||
| 9 | + | В формате файла ELF нет неявных положений о номерах версий, авторских правах и так далее, но Lazarus хранит это в разделах ресурсов. Чтение информации во время исполнения программы зависит от модулей FPC, ниже - некоторая полезная информация. | |
| 10 | + | ||
| 11 | + | ### macOS и iOS | |
| 12 | + | ||
| 13 | + | Для macOS информация о версии файла Lazarus может храниться в двух местах: | |
| 14 | + | ||
| 15 | + | - исполняемый файл MACH-O (например, в Windows, Linux); см. ниже | |
| 16 | + | - комплект приложения (если он есть) в plist. См. [[Mac Show Application Title, Version, and Company]] для получения дополнительной информации. | |
| 17 | + | ||
| 18 | + | ## Реализации | |
| 19 | + | ||
| 20 | + | ### FPC 3.0 | |
| 21 | + | ||
| 22 | + | Реализация в FPC 3.0.x с использованием [[fcl-res]]: см. [[http://wiki.lazarus.freepascal.org/User Changes 3.0|announcement in User Changes 3.0]] | |
| 23 | + | ||
| 24 | + | В приведенном ниже коде показано, как получить информацию об исполняемых файлах из | |
| 25 | + | ||
| 26 | + | - .exe/.dll/.ocx (формат Windows) файлов | |
| 27 | + | - исполняемых файлов ELF, скомпилированных в Lazarus (Linux), | |
| 28 | + | - исполняемых файлов MACH-O, скомпилированных в Lazarus (OSX) | |
| 29 | + | ||
| 30 | + | ``` pascal | |
| 31 | + | program printfileinfo; | |
| 32 | + | {Отображает информацию о версии файла для | |
| 33 | + | - исполняемых файлов Windows PE | |
| 34 | + | - исполняемых Linux ELF (скомпилированных в Lazarus) | |
| 35 | + | - исполняемых файлов MACH-O OSX (скомпилированных в Lazarus) | |
| 36 | + | Запускается на Windows, Linux, OSX... | |
| 37 | + | } | |
| 38 | + | ||
| 39 | + | {$mode objfpc}{$H+} | |
| 40 | + | {$ifdef mswindows}{$apptype console}{$endif} | |
| 41 | + | uses | |
| 42 | + | {$IFDEF UNIX}{$IFDEF UseCThreads} | |
| 43 | + | cthreads, | |
| 44 | + | {$ENDIF}{$ENDIF} | |
| 45 | + | Classes,sysutils | |
| 46 | + | // FPC 3.0 fileinfo читает ресурсы exe, пока вы регистрируете соответствующие модули | |
| 47 | + | , fileinfo | |
| 48 | + | , winpeimagereader {это нужно для чтения информации exe} | |
| 49 | + | , elfreader {необходимо для чтения исполняемых файлов ELF} | |
| 50 | + | , machoreader {необходимо для чтения исполняемых файлов MACH-O} | |
| 51 | + | ; | |
| 52 | + | ||
| 53 | + | var | |
| 54 | + | FileVerInfo: TFileVersionInfo; | |
| 55 | + | ||
| 56 | + | {$R *.res} | |
| 57 | + | ||
| 58 | + | begin | |
| 59 | + | FileVerInfo:=TFileVersionInfo.Create(nil); | |
| 60 | + | try | |
| 61 | + | FileVerInfo.ReadFileInfo; | |
| 62 | + | writeln('Company: ',FileVerInfo.VersionStrings.Values['CompanyName']); | |
| 63 | + | writeln('File description: ',FileVerInfo.VersionStrings.Values['FileDescription']); | |
| 64 | + | writeln('File version: ',FileVerInfo.VersionStrings.Values['FileVersion']); | |
| 65 | + | writeln('Internal name: ',FileVerInfo.VersionStrings.Values['InternalName']); | |
| 66 | + | writeln('Legal copyright: ',FileVerInfo.VersionStrings.Values['LegalCopyright']); | |
| 67 | + | writeln('Original filename: ',FileVerInfo.VersionStrings.Values['OriginalFilename']); | |
| 68 | + | writeln('Product name: ',FileVerInfo.VersionStrings.Values['ProductName']); | |
| 69 | + | writeln('Product version: ',FileVerInfo.VersionStrings.Values['ProductVersion']); | |
| 70 | + | finally | |
| 71 | + | FileVerInfo.Free; | |
| 72 | + | end; | |
| 73 | + | end. | |
| 74 | + | ``` | |
| 75 | + | ||
| 76 | + | ### Реализации с использованием устаревшего FPC 2.6.x | |
| 77 | + | ||
| 78 | + | Использует [[fcl-res]]; вклад через список рассылки: [1](http://lists.lazarus.freepascal.org/pipermail/lazarus/attachments/20100723/8db6b97e/attachment.ksh) | |
| 79 | + | ||
| 80 | + | Используйте это как | |
| 81 | + | ||
| 82 | + | ``` pascal | |
| 83 | + | uses | |
| 84 | + | resource, versiontypes, versionresource; | |
| 85 | + | ||
| 86 | + | FUNCTION resourceVersionInfo: STRING; | |
| 87 | + | ||
| 88 | + | (* В отличие от большинства AboutText (см.ниже), это требует значительных усилий *) | |
| 89 | + | (* во время выполнения программы для извлечения номеров версий/выпусков/сборок из *) | |
| 90 | + | (* информации о ресурсах, добавленной в двоичный файл. *) | |
| 91 | + | ||
| 92 | + | VAR Stream: TResourceStream; | |
| 93 | + | vr: TVersionResource; | |
| 94 | + | fi: TVersionFixedInfo; | |
| 95 | + | ||
| 96 | + | BEGIN | |
| 97 | + | RESULT:= ''; | |
| 98 | + | TRY | |
| 99 | + | ||
| 100 | + | (* Это вызывет исключение, если информация о версии не была включена в двоичный *) | |
| 101 | + | (* файл (Lazarus Project -> Project Options -> Version Info -> Version *) | |
| 102 | + | (* numbering). *) | |
| 103 | + | ||
| 104 | + | Stream:= TResourceStream.CreateFromID(HINSTANCE, 1, PChar(RT_VERSION)); | |
| 105 | + | TRY | |
| 106 | + | vr:= TVersionResource.Create; | |
| 107 | + | TRY | |
| 108 | + | vr.SetCustomRawDataStream(Stream); | |
| 109 | + | fi:= vr.FixedInfo; | |
| 110 | + | RESULT := 'Version ' + IntToStr(fi.FileVersion[0]) + '.' + IntToStr(fi.FileVersion[1]) + | |
| 111 | + | ' release ' + IntToStr(fi.FileVersion[2]) + ' build ' + IntToStr(fi.FileVersion[3]) + eol; | |
| 112 | + | vr.SetCustomRawDataStream(nil) | |
| 113 | + | FINALLY | |
| 114 | + | vr.Free | |
| 115 | + | END | |
| 116 | + | FINALLY | |
| 117 | + | Stream.Free | |
| 118 | + | END | |
| 119 | + | EXCEPT | |
| 120 | + | END | |
| 121 | + | END { resourceVersionInfo } ; | |
| 122 | + | ``` | |
| 123 | + | ||
| 124 | + | Использоаавние vinfo: [здесь](http://forum.lazarus.freepascal.org/index.php?topic=12435.0) и [здесь](http://forum.lazarus.freepascal.org/index.php?topic=13957.0) | |
| 125 | + | ||
| 126 | + | ## Советы по теме | |
| 127 | + | ||
| 128 | + | ### Ревизии SVN/Git/Hg/Mercurial | |
| 129 | + | ||
| 130 | + | Используйте `$(lazarusdir)/tools/svn2revisioninc` для получения номера ревизии (из репозиториев subversion, git или mercurial) в файле revision.inc, например что-то вроде: | |
| 131 | + | ||
| 132 | + | ``` pascal | |
| 133 | + | // Создан при помощи Svn2RevisionInc | |
| 134 | + | const RevisionStr = '43594'; | |
| 135 | + | ``` | |
| 136 | + | ||
| 137 | + | ## Хаки только для Unix-систем | |
| 138 | + | ||
| 139 | + | Они работают с Linux на различных платформах и, вероятно, с Solaris при условии, что установлены утилиты, производные от GNU. | |
| 140 | + | ||
| 141 | + | ### Получение информации о версии Subversion в виде строки, доступной для программы | |
| 142 | + | ||
| 143 | + | Вставьте это в Project options -\> Compilation -\> Execute before -\> Command: | |
| 144 | + | ||
| 145 | + | ``` bash | |
| 146 | + | /bin/sh -c "echo -n C`svnversion -n`C |tr A-G %-+ >project_svnrevision.inc" | |
| 147 | + | ``` | |
| 148 | + | ||
| 149 | + | 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` в другой уровень цитат, который необходим для того, чтобы все работало должным образом. | |
| 150 | + | ||
| 151 | + | Поместите это в программу: | |
| 152 | + | ||
| 153 | + | ``` pascal | |
| 154 | + | (*$IFDEF UNIX *) | |
| 155 | + | rev= (*$I project_svnrevision.inc *) ; | |
| 156 | + | (*$ELSE *) | |
| 157 | + | rev= 'unimplemented'; | |
| 158 | + | (*$ENDIF *) | |
| 159 | + | ``` | |
| 160 | + | ||
| 161 | + | Обратите внимание, что это должна быть строка, так как номер версии будет иметь нечисловой суффикс, если проект был обновлен с момента его последней фиксации. | |
| 162 | + | ||
| 163 | + | ### Переименование окончательного исполняемого файла, чтобы включить в его название платформу и метку времени | |
| 164 | + | ||
| 165 | + | Вставьте это в Project options -\> Paths -\> Unit output directory: | |
| 166 | + | ||
| 167 | + | ``` bash | |
| 168 | + | lib/$(TargetCPU)-$(TargetOS) | |
| 169 | + | ``` | |
| 170 | + | ||
| 171 | + | Вставьте это в Project options -\> Paths -\> Target file name: | |
| 172 | + | ||
| 173 | + | ``` bash | |
| 174 | + | UnyokedBackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType) | |
| 175 | + | ``` | |
| 176 | + | ||
| 177 | + | Убедитесь, что установлена галочка "Apply conventions"(Применить соглашения). Это может немного отличаться в зависимости от версии IDE и компилятора/компоновщика. | |
| 178 | + | ||
| 179 | + | Вставьте это в Project options -\> Compilation -\> Execute after -\> Command: | |
| 180 | + | ||
| 181 | + | ``` bash | |
| 182 | + | /bin/sh -c "mv libunyokedbackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType).so UnyokedBackend-$(TargetCPU)-$(TargetOS)-$(LCLWidgetType).`date +%F.%R`.so" | |
| 183 | + | ``` | |
| 184 | + | ||
| 185 | + | Это должна быть одна строка. Обратите внимание на кавычки и обратные кавычки. | |
| 186 | + | ||
| 187 | + | --- | |
| 188 | + | *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](/wiki-contact).* | |
| 189 | + | Category: Code | |
| 190 | + | Category: FPC | |
| 191 | + | Category: Lazarus | |
| 192 | + | Category: Linux | |
| 193 | + | Category: Windows | |
| 194 | + | Category: macOS |
