Ok!.. fíjate que internamente la función VersionExe utiliza la winapi GetFileVersionInfo a la cual hice referencia. También terminas obteniendo un registro del tipo TVSFixedFileInfo con dos valores que luego descompones en cuatro. Yo lo que digo es utilizar esos dos valores sin pasarlos a string, es algo mucho mas óptimo ya que se trata de únicamente dos evaluaciones aritméticas por cada comparación.
Hice esto,
está sin probar:
Código Delphi
[-]
function GetFileInfo(AFileName: PChar): TVSFixedFileInfo;
var
dwSize, dwSize2: DWORD;
lpData, lpData2: Pointer;
begin
ZeroMemory(@Result, SizeOf(TVSFixedFileInfo));
if FileExists(AFileName) then
begin
dwSize := GetFileVersionInfoSize(AFileName, dwSize2);
if dwSize > 0 then
begin
GetMem(lpData, dwSize);
try
GetFileVersionInfo(AFileName, 0, dwSize, lpData);
VerQueryValue(lpData, '\', lpData2, dwSize2);
Move(lpData2^, Result, dwSize2);
finally
FreeMem(lpData);
end;
end;
end;
end;
function GetFileVersion(AFileName: string): string;
begin
with GetFileInfo(PChar(AFileName)) do
Result:= Format('%d.%d.%d.%d', [HiWord(dwFileVersionMS),
LoWord(dwFileVersionMS),
HiWord(dwFileVersionLS),
LoWord(dwFileVersionLS)] );
end;
function CompareFileVersions(AFileName1, AFileName2: string): Integer;
var
FileInfo1, FileInfo2: TVSFixedFileInfo;
begin
FileInfo1 := GetFileInfo(PChar(AFileName1));
FileInfo2 := GetFileInfo(PChar(AFileName2));
Result := CompareValue(FileInfo1.dwFileVersionMS, FileInfo2.dwFileVersionMS);
if Result = 0 then
Result := CompareValue(FileInfo1.dwFileVersionLS, FileInfo2.dwFileVersionLS);
end;
Saludos!