AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programmversionen vergleichen + Update

Ein Thema von Freyr77 · begonnen am 3. Feb 2016 · letzter Beitrag vom 4. Feb 2016
Antwort Antwort
Seite 1 von 2  1 2      
Freyr77
(Gast)

n/a Beiträge
 
#1

Programmversionen vergleichen + Update

  Alt 3. Feb 2016, 13:38
Delphi-Version: 5
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Programmversionen vergleichen + Update

  Alt 3. Feb 2016, 13:46
Nun ja, du musst 4 Zahlen vom Typ DWORD vergleichen.

Den String 2.2.2 zerlegst am Punkt du in max. 4 Teile und wandelst dann die Teilstrings in ein DWORD um.
Code:
Major  = 2
Minor  = 2
Release = 2
Build  = 0
Diese kannst du dann vergleichen.

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 http://www.delphi-treff.de/tutorials...on-operatoren/
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Programmversionen vergleichen + Update

  Alt 3. Feb 2016, 13:47
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;
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina ( 3. Feb 2016 um 13:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Programmversionen vergleichen + Update

  Alt 3. Feb 2016, 13:49
Delphi-Quellcode:
If '4.3.2' < ApplicationVersion then
begin
  // alte Version
end;
Ein String-Vergleich ist da nicht ratsam
Delphi-Quellcode:
if '8.0.0' < '9.0.0then
begin
  // alte Version
end;

// und jetzt???

If '10.0.0' < '9.0.0then
begin
  // alte Version
end;

// und jetzt???

if '9.11.4' < '9.5.7then
begin
  // alte Version
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Programmversionen vergleichen + Update

  Alt 3. Feb 2016, 14:00
Sry, Rufo, hast recht, siehe EDIT oben.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Programmversionen vergleichen + Update

  Alt 3. Feb 2016, 14:24
Ja das passt schon eher.

Ich würde - wie schon gesagt - einen Record deklarieren und den alles machen lassen.
Delphi-Quellcode:
var
  lCurrent, lRemote: TVersion;
begin
  lCurrent := '7.3.5';
  lRemote := '7.11.3';
  if lCurrent < lRemote then
  begin
    // Update durchführen
  end;
end;
Das ist einmal gemacht, kann man aber immer wieder verwenden und es ist eindeutig, dass es sich hier um eine Versions-Information handelt.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Freyr77
(Gast)

n/a Beiträge
 
#7

AW: Programmversionen vergleichen + Update

  Alt 4. Feb 2016, 14:54
Danke!

Aber wie hole ich mir dann die Daten aus "GetVersion" heraus, um die auch zu zerlegen?
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Programmversionen vergleichen + Update

  Alt 4. Feb 2016, 15:03
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;
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Programmversionen vergleichen + Update

  Alt 4. Feb 2016, 15:25
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.
$2B or not $2B

Geändert von himitsu ( 4. Feb 2016 um 15:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#10

AW: Programmversionen vergleichen + Update

  Alt 4. Feb 2016, 15:43
[...]2.2.2 zerlegst am Punkt du in max. 4 Teile[...]
Noch nie Blizzard-Patchversionen gesehen oder ?
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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz