GetFileVersion returns the result only if there are only numbers fileversion
But some program\library does not contain VersionInfo, but contain String VersionInfo (oracleclient.dll)
Maybe add function GetFileVersionInfoStr
Code: Select all
function GetFileVersionStr(const AFileName: String) : String;
var
P: Pointer;
Value: Pointer;
Len: DWORD;
FHandle: DWORD;
FBuffer: String;
VerInt64: Int64;
begin
VerInt64 := GetFileVersion(AFileName);
if VerInt64 > 0 then
Result := FileVersionToStr(VerInt64)
else begin
P := nil;
Len := GetFileVersionInfoSize(PAnsiChar(AFileName), FHandle);
if Len > 0 then
SetLength(FBuffer, Len);
if GetFileVersionInfo(PAnsiChar(AFileName), FHandle, Len, Pointer(FBuffer)) and
VerQueryValue(Pointer(FBuffer), '\VarFileInfo\Translation', P, Len) and (P <> nil) then begin
VerInt64 := MakeLong(HiWord(Longint(P^)), LoWord(Longint(P^)));
if VerQueryValue(Pointer(FBuffer), PAnsiChar('\StringFileInfo\' +
CopyR(IntToHexEx(VerInt64, 8), 8) + '\FileVersion'), Value, Len) then
Result := PAnsiChar(Value);
end;
end;
end;
code
Code: Select all
i64 := GetFileVersion(filePath);
if i64 <> 0 then
version := string(FileVersionToStr(i64));
Code: Select all
version := GetFileVersionStr(filePath);