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
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to