Ich nutze die Version von
DelphiTreff:
Delphi-Quellcode:
function GetFileVersion(Path: string): string;
var
lpVerInfo: pointer;
rVerValue: PVSFixedFileInfo;
dwInfoSize: cardinal;
dwValueSize: cardinal;
dwDummy: cardinal;
lpstrPath: pchar;
begin
if Trim(Path) = EmptyStr then
lpstrPath := pchar(ParamStr(0))
else
lpstrPath := pchar(Path);
dwInfoSize := GetFileVersionInfoSize(lpstrPath, dwDummy);
if dwInfoSize = 0 then
begin
Result := 'No version specification';
Exit;
end;
GetMem(lpVerInfo, dwInfoSize);
GetFileVersionInfo(lpstrPath, 0, dwInfoSize, lpVerInfo);
VerQueryValue(lpVerInfo, '', pointer(rVerValue), dwValueSize);
with rVerValue^ do
begin
Result := IntTostr(dwFileVersionMS shr 16);
Result := Result + '.' + IntTostr(dwFileVersionMS and $FFFF);
Result := Result + '.' + IntTostr(dwFileVersionLS shr 16);
Result := Result + '.' + IntTostr(dwFileVersionLS and $FFFF);
end;
FreeMem(lpVerInfo, dwInfoSize);
end; {function GetFileVersion() ...}
Aufgerufen wird diese dann:
Delphi-Quellcode:
variable1 := GetFileVersion('USB.exe');
variable2 := GetFileVersion('HDD.exe');
Und was die Auswertung angeht, kommt es auf den Aufbau der Versionsnummer an. Gehe ich von dem gleichen Aufbau wie in Delphi aus, wäre eine Möglichkeit die Dateiversion in teilen zu prüfen. Dabei würde ich wie folgt vorgehen:
1. Die Dateiversionen nach '.' durchsuchen und zählen (= Anzahl der zu prüfenden Zahlen + 1; evtl. Vergleichen ob beide Versionsnummern die gleiche Anzahl haben!) z.B.(Herkunft weiß ich nicht mehr^^):
Delphi-Quellcode:
function Split(text: string; delimiter: char; p: integer): string;
var
stl: TStrings;
begin
stl := TStringList.Create;
try
stl.delimiter := delimiter;
stl.DelimitedText := text;
finally
result := stl.Strings[p];
stl.free;
end;
end;
Aufruf:
split(String, '.', Teil);
2. Die entsprechenden Teile mit einander vergleichen, von vorne nach hinten.
3. Sobald sie unterschiedlich sind, prüfen welche größer ist und die Vergleichs-Schleife verlassen.
4. Kopiervorgang abhängig der letzten Prüfung einleiten.