<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>