![]() |
Delphi-Version: 5
Programmversionen vergleichen + Update
Moin.
Es geht diesmal nicht um mein Projekt. Es geht darum das bei start eines Programmes überprüft werden soll, ob ein externes Programm eine aktuelle Version aus Kompatibilitätsgründen hat. Dafür habe ich einen TaskDialog geschrieben, der sich nur starten soll wenn die aktuelle Programmversion älter ist als die unterstützte. Das herausfinden der aktuell installierten Version ist schon möglich, dafür gibt es einen Befehl. Wenn ich ihm jetz sage er soll den Dialog nur öffnen, wenn die aktuell installierte Version vorhanden ist, funktioniert das. Jetzt muss ich die aktuelle Version aber irgendwie vergleichen (z.B. Aktuelle Version < 2.2.2). Wie mache ich das am besten, um irgendwelchen Fehlern vorzubeugen? Und wie verbinde ich den klick auf den Button im Taskdialog dann so, dass das Update automatisch vorgenommen wird? |
AW: Programmversionen vergleichen + Update
Nun ja, du musst 4 Zahlen vom Typ
Delphi-Quellcode:
vergleichen.
DWORD
Den String 2.2.2 zerlegst am Punkt du in max. 4 Teile und wandelst dann die Teilstrings in ein
Delphi-Quellcode:
um.
DWORD
Code:
Diese kannst du dann vergleichen.
Major = 2
Minor = 2 Release = 2 Build = 0 Ich würde dafür einen Record nehmen, der dann den Vergleich und auch die Konvertierungen (String -> Version -> String) intern vornimmt. Das Wie steht da ![]() |
AW: Programmversionen vergleichen + Update
EDIT : ** Moment, da hab ich was falsches kopiert **
Das hier ist das was ich kopieren wollte, das wandelt den Versionsstring (z.B. '4.2.3') in einen Int64 um, den man dann für den Versionsvergleich verwenden kann:
Delphi-Quellcode:
function VersionNumberFromString (s: string): Int64;
var ErrPos : Integer; Index : Integer; Parts : packed array [0..3] of Word; begin FillChar(Parts, SizeOf(Parts), 0); for Index := 3 downto 0 do begin Val (s, Parts[Index], ErrPos); if (ErrPos = 0) then Break; Delete (s, 1, ErrPos); end; Result := Int64(Parts); end; |
AW: Programmversionen vergleichen + Update
Zitat:
Delphi-Quellcode:
if '8.0.0' < '9.0.0' then
begin // alte Version end; // und jetzt??? If '10.0.0' < '9.0.0' then begin // alte Version end; // und jetzt??? if '9.11.4' < '9.5.7' then begin // alte Version end; |
AW: Programmversionen vergleichen + Update
Sry, Rufo, hast recht, siehe EDIT oben.
|
AW: Programmversionen vergleichen + Update
Ja das passt schon eher.
Ich würde - wie schon gesagt - einen Record deklarieren und den alles machen lassen.
Delphi-Quellcode:
Das ist einmal gemacht, kann man aber immer wieder verwenden und es ist eindeutig, dass es sich hier um eine Versions-Information handelt.
var
lCurrent, lRemote: TVersion; begin lCurrent := '7.3.5'; lRemote := '7.11.3'; if lCurrent < lRemote then begin // Update durchführen end; end; |
AW: Programmversionen vergleichen + Update
Danke!
Aber wie hole ich mir dann die Daten aus "GetVersion" heraus, um die auch zu zerlegen?:| |
AW: Programmversionen vergleichen + Update
Delphi-Quellcode:
function ApplicationVersion: String;
var VerInfoSize, Dummy: DWord; VerInfo: Pointer; VerValueSize: DWord; VerValue: PVSFixedFileInfo; begin VerInfoSize:=GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy); If VerInfoSize<>0 then begin GetMem(VerInfo, VerInfoSize); GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo); VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize); with VerValue^ 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(VerInfo, VerInfoSize); end else Result:='Version Inconnue'; end; |
AW: Programmversionen vergleichen + Update
Man kann als String vergleichen ... muß dann aber die Zahlen normieren.
z.B. jede der 4 Zahlen mit 5 Dezimalstellen und nach links mit 0 aufgefüllt. Das sind jeweils ein Word, also maximal 5 Dezimalstellen und da die höherwertigsten Versions-Anteile auch links stehen. :angle: |
AW: Programmversionen vergleichen + Update
Zitat:
Produktversionen einer Datei können beliebig lang sein. Ich wär also vorsichtig! (ja ok es gebt um die Fileversion, trotzdem ;) ) Für unser Produkt habe ich soetwas auch schonmal geschrieben. Ich generiere einfach aus einem string einen array of DWord und vergleiche dann zwei arrays. Das nagelt einen nicht auf die Elementanzahl fest und es lässt sich somit Vielseitiger verwenden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz