<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">Am 06.11.2013 16:07, schrieb Antonio
Fortuny:<br>
</div>
<blockquote cite="mid:527A5B16.1060309@sitasoftware.lu" type="cite">
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
<br>
<div class="moz-cite-prefix">Le 06/11/2013 15:46, Anton Kavalenka
a écrit :<br>
</div>
<blockquote cite="mid:527A5640.7030909@tut.by" type="cite">
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
Handle of EXE (hInstance) or .SO hMod:=Loadlibrary(dll_name);<br>
</blockquote>
Works fine on Win32 with <b><big>hInstance</big></b><big>: great
! <span class="moz-smiley-s11"><span> 8-) </span></span><br>
I guess it will run on Linux too<br>
Thanks.<br>
</big>
<blockquote cite="mid:527A5640.7030909@tut.by" type="cite"> <br>
regards,<br>
Anton<br>
</blockquote>
The code I use for Linux is the next one, which works almost the
same except that the source is a file:<br>
<br>
function ReadVersionInfo(const sProgram: string; Out vv: String)
:Boolean;<br>
var<br>
RS : TResources;<br>
E : TElfResourceReader;<br>
VR : TVersionResource;<br>
I : Integer;<br>
begin<br>
Result := False; //no version info at all in the file<br>
RS:=TResources.Create;<br>
try<br>
E:=TElfResourceReader.Create;<br>
try<br>
Rs.LoadFromFile(sProgram,E);<br>
finally<br>
E.Free;<br>
end;<br>
VR:=Nil;<br>
I:=0;<br>
While (VR=Nil) and (I<RS.Count) do begin<br>
if RS.Items[i] is TVersionResource then<br>
VR:=TVersionResource(RS.Items[i]);<br>
Inc(I);<br>
end;<br>
Result:=(VR<>Nil);<br>
if Result then begin<br>
vv:= Format('%d.%d.%d.%d',[VR.FixedInfo.FileVersion[0],
VR.FixedInfo.FileVersion[1], VR.FixedInfo.FileVersion[2],
VR.FixedInfo.FileVersion[3]]);<br>
End ;<br>
Finally<br>
RS.FRee;<br>
end;<br>
<br>
Question is: does an equivalent to the "T<b><big>Elf</big></b>ResourceReader"
exist for Windows executable files ?<br>
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).<br>
Maybe a couple of [$IFDEF ...} will be needed but this is not an
issue.<br>
BTW, if the procedure works for WinCE too I'll be the happiest man
on world.<br>
If this piece of code could be helpfull to others, it could be
integrated to FPC or Lazarus, whatever.<br>
It will need some rewriting though.<br>
<br>
</blockquote>
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.<br>
<br>
Regards,<br>
Sven<br>
</body>
</html>