<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
On 22.02.2015 20:37, Mattias Gaertner wrote:<br>
<blockquote cite="mid:20150222193756.261b3aad@limapholos.matflo.wg"
type="cite">
<pre wrap="">Post a complete example and someone can find out.
Mattias</pre>
</blockquote>
code block is not mine, I was find in this link.<br>
<a class="moz-txt-link-freetext" href="http://lists.lazarus.freepascal.org/pipermail/lazarus/2013-November/084198.html">http://lists.lazarus.freepascal.org/pipermail/lazarus/2013-November/084198.html</a><br>
<br>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<pre>function AnyProgramVersion(const sProgram: string; Out vv: PTVersion) :Boolean;
const
WIN_EXE: String = 'MZ';
LINUX_EXE: String = #127 + 'ELF';
var
wFileStr: TFileStream;
RS : TResources;
E : TWinPEImageResourceReader=nil;
EL : TElfResourceReader=nil;
VR : TVersionResource;
I : Integer;
{$IFDEF WINCE}
wProgram: WideString;
{$ELSE}
wProgram: String;
{$ENDIF}
ar: array[0..4] of byte;
ExecType: char;
begin
Result := False;
vv := New(PTVersion);
with vv^ do begin
Major:= -1;
Minor := 0;
Release := 0;
Build := 0;
end;
if sProgram = EmptyStr then
wProgram := ParamStr(0)
else
wProgram := sProgram;
if not FileExists(wProgram) then begin
// program name without path, assume directory of executing program
if Pos(DirectorySeparator, wProgram) = 0 then begin
wProgram := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + sProgram;
if not FileExists(wProgram) then
Exit;
end else
// no path delimiter, get out
Exit;
end else
wProgram := sProgram;
wFileStr := TFileStream.Create(sProgram, fmOpenRead);
try
// check what kind of executable an get resources accordingly
wFileStr.Read(ar, 4);
Finally
wFileStr.Free;
end;
if CompareMem(@(ar), Pchar(WIN_EXE), 2) then
ExecType := 'W'
else
if CompareMem(@(ar), Pchar(LINUX_EXE), 4) then
ExecType := 'L'
else
Exit;
RS:=TResources.Create;
try
try
if ExecType = 'W' then begin
E := TWinPEImageResourceReader.Create;
Rs.LoadFromFile(wProgram, E);
end else begin
EL := TElfResourceReader.Create;
Rs.LoadFromFile(wProgram, EL);
end;
finally
if Assigned(E) then
E.Free;
if Assigned(EL) then
EL.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;
if VR <> Nil then begin
with vv^ do begin
Major:= VR.FixedInfo.FileVersion[0];
Minor := VR.FixedInfo.FileVersion[1];
Release := VR.FixedInfo.FileVersion[2];
Build := VR.FixedInfo.FileVersion[3];
end;
Result := True
End ;
Finally
RS.FRee;
end;
end;
{$IFDE</pre>
<br>
</body>
</html>