[Lazarus] Program version

Sven Barth pascaldragon at googlemail.com
Wed Nov 6 16:31:24 CET 2013


Am 06.11.2013 16:07, schrieb Antonio Fortuny:
>
> Le 06/11/2013 15:46, Anton Kavalenka a écrit :
>> Handle of EXE (hInstance) or .SO hMod:=Loadlibrary(dll_name);
> Works fine on Win32 with *hInstance*: great ! 8-)
> I guess it will run on Linux too
> Thanks.
>>
>> regards,
>> Anton
> The code I use for Linux is the next one, which works almost the same 
> except that the source is a file:
>
> function ReadVersionInfo(const sProgram: string; Out vv: String) :Boolean;
> var
>   RS : TResources;
>   E : TElfResourceReader;
>   VR : TVersionResource;
>   I : Integer;
> begin
>   Result := False; //no version info at all in the file
>   RS:=TResources.Create;
>   try
>     E:=TElfResourceReader.Create;
>     try
>       Rs.LoadFromFile(sProgram,E);
>     finally
>       E.Free;
>     end;
>     VR:=Nil;
>     I:=0;
>     While (VR=Nil) and (I<RS.Count) do begin
>       if RS.Items[i] is TVersionResource then
>         VR:=TVersionResource(RS.Items[i]);
>       Inc(I);
>     end;
>     Result:=(VR<>Nil);
>     if Result then begin
>       vv:= Format('%d.%d.%d.%d',[VR.FixedInfo.FileVersion[0], 
> VR.FixedInfo.FileVersion[1], VR.FixedInfo.FileVersion[2], 
> VR.FixedInfo.FileVersion[3]]);
>     End ;
>   Finally
>     RS.FRee;
>   end;
>
> Question is: does an equivalent to the "T*Elf*ResourceReader" exist 
> for Windows executable files ?
> I'm pretty sure that you do guess what I'm trying to do: have only one 
> fuction to retrieve the version of any program on any platform. If a 
> version using a file name can be setup, wonking on the current program 
> is easy: check on ParamStr(0).
> Maybe a couple of [$IFDEF ...} will be needed but this is not an issue.
> BTW, if the procedure works for WinCE too I'll be the happiest man on 
> world.
> If this piece of code could be helpfull to others, it could be 
> integrated to FPC or Lazarus, whatever.
> It will need some rewriting though.
>
If you look at my other mail you'll see the solution. The reader unit 
for Windows PE files is WinPEImageReader. And you can avoid ifdefs by 
additionally to unit "resources" using the units "elfreader", 
"winpeimagereader" and "versionresource". Then you can do 
"Rs.LoadFromFile(sProgram);" (the explicit reader isn't needed as the 
extension will be used) and either loop through all resources like you 
currently do or use "Rs.Find(RT_VERSION, 1)" which should(!) return you 
the correct version resource.

Regards,
Sven
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20131106/930ee0e2/attachment-0003.html>


More information about the Lazarus mailing list