Autor |
Beitrag |
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 03.04.04 18:31
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Sa 03.04.04 18:50
Danke für deine Hilfe, aber es hat sich erledigt. Alles funktioniert.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 03.04.04 21:14
Das war als Kritik gedacht, nicht als Hilfe. Deine Form des Updates ist alles andere als effizient.
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: So 04.04.04 10:12
Dann wars halt Kritik ist jetzt auch egal, solangs geht, wo ist da das Problem
EDIT: Mit den 2 Rich kann man sehen, welche Version man hat, was auch nicht so schlecht ist, wenn es ein Prob. gibt und jemand mir ne Mail schickt und sagt welche Version er hat.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 04.04.04 10:35
GTA-Place hat folgendes geschrieben: | EDIT: Mit den 2 Rich kann man sehen, welche Version man hat, was auch nicht so schlecht ist, wenn es ein Prob. gibt und jemand mir ne Mail schickt und sagt welche Version er hat. |
Dazu brauchst du kein RichEdit. Ein Edit oder besser noch ein Label reicht da völlig aus. Wenn du in deinem Programm eine Konstante definierst, etwa
Delphi-Quelltext 1: 2:
| const szCurrentVersion = '1.1.0.0'; |
dann dürfte es für dich wohl kein Problem sein, diese Konstante an ein Label weiterzureichen. Ich glaube aber, jemand hat dir hier sogar gesagt (zumindest via Link) wie man die Versionsnummer des Programms selbst auslesen kann (das, was du in den Projektoptionen unter "Version" einstellen kannst). Da das Ergebnis ebenfalls ein String ist, ist die Anzeige in einem Label, bzw. der Vergleich mit einem vom Server ermittelten Wert wohl kaum das Problem.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 04.04.04 13:00
Damit du mir nicht vorwirfst, ich würde nur meckern aber nichts Produktives beitragen, habe ich mal eine Demo zusammengeschraubt: WebUpdate.zip. Allerdings ist es nur der Quellcode. Aber da wir hier in einem Delphiforum sind, macht das sicher nichts.
Und du brauchst Microsoft XML 4 (Anleitung s. Quellcode, Projektquelltext). Standardmäßig liest das Programm die lokale XML-Datei aus. Wenn du die Info direkt aus dem Web lesen willst (die gleiche XML-Datei liegt noch mal auf dem Server), dann entferne den Punkt in der Zeile
Delphi-Quelltext
("Unit1.pas"). Das Programm verbindet sich allerdings nicht selbst, und ich übernehme auch keine Garantie, dass die Funktion "IsOnline" (zum Prüfen ob eine Verbindung da ist oder nicht) in jedem Fall funktioniert. Notfalls musst du die entsprechenden Zeilen am Anfang der Buttonklick-Prozedur also mal kurz auskommentieren.
Zuletzt bearbeitet von MathiasSimmack am So 04.04.04 14:12, insgesamt 1-mal bearbeitet
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: So 04.04.04 13:19
Schon runtergeladen
THX!
Gleich mal testen!
EDIT: Delphi findet "MSXML4_TLB" nicht. Hab XML Installiert.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 04.04.04 13:55
Ich habe doch gesagt, schau in den Projektquelltext (Project1.dpr)
Zitat: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| MSXML4_TLB in '..\MSXML4_TLB.pas';
| |
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: So 04.04.04 14:24
Achso.
Zitat: |
1. Undefinierter Bezeichner: 'InternetGetConnectedState'.
2. Deklaration von 'GetPriority' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'.
3. Deklaration von 'OnDataAvailable' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'.
4. Deklaration von 'OnObjectAvailable' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'.
|
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 04.04.04 17:06
Zitat: | 1. Undefinierter Bezeichner: 'InternetGetConnectedState'. |
Evtl. ein Delphi 3-Problem. Du kannst versuchen, das Problem mit dieser Deklaration zu umgehen:
Delphi-Quelltext 1: 2:
| function InternetGetConnectedState(lpdwFlags: PDWORD; dwReserved: dword): boolean; stdcall; external 'wininet.dll'; |
Zitat: | 2. Deklaration von 'GetPriority' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'.
3. Deklaration von 'OnDataAvailable' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'.
4. Deklaration von 'OnObjectAvailable' unterscheidet sich von der Deklaration in interface 'IBindStatusCallback'. |
Du hast, laut Profil, Delphi 3 Professional. Das heißt, die Quellcodes der Units liegen bei. Such bitte in der Unit "UrlMon.pas" nach IBindStatusCallback und schau dir die Deklarationen der entsprechenden Funktionen an. Dann übernimmst du die Deklarationen aus der Unit in das Programm.
Die Deklarationen müssen in der Unit und im Programm identisch sein. Deswegen schaust du dir an, was bei den 3 bemängelten Funktionen in der Unit steht und übernimmst diese Angaben in das Programm. Bitte nicht umgekehrt!
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: So 04.04.04 17:32
Jetzt kommt keine Fehlermeldung mehr, aber wenn ich das Prog. starte, beendet sich es automatisch wieder.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 04.04.04 18:24
Ganz ohne Meldung? Dann kommen eigentlich nur noch 2 Kandidaten in Frage (s. Unit1, ganz am Ende):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| initialization if(WsaStartup(MAKEWORD(1,0),wsadata) <> 0) then Application.Terminate; if(CoInitialize(nil) <> S_OK) then Application.Terminate; finalization CoUninitialize; WsaCleanup; end. |
"CoInitialize" und "CoUninitialize" (ActiveX-Unit) dienen eigentlich dazu, das XML-Objekt zu initialisieren. Das benötigt man aber eigentlich nur in nonVCL-Anwendungen. Bei der VCL gibt es garantiert irgendeine Unit, die das aufruft. Aber falsch ist es nicht, und darum schreibe ich das grundsätzlich dazu (wenn auch nicht in dieser Form). Du kannst es versuchsweise weglassen, aber ich kann dir nicht versprechen, dass dann der XML-Code geht.
"WsaStartup" und "WsaCleanup" (WinSock-Unit) sind für die erweiterten Eigenschaften der Funktion "IsOnline" nötig. Ich habe schon extra die Version 1.0 genommen (s. "MAKEWORD(1,0)"), die eigentlich jede Windows-Version unterstützen sollte. Alternativ kannst du die Funktion "IsOnline" ja auch kürzen:
Delphi-Quelltext 1: 2: 3: 4:
| function IsOnline: boolean; begin Result := InternetGetConnectedState(nil,0); end; |
und dann kannst du "WsaStartup" und "WsaCleanup" weglassen.
Wenn´s dann immer noch nicht geht, würde ich vorschlagen: Nimm dir das Geld und kaufe dir morgen die c't. Da liegt wohl Delphi 7 Personal bei. Dann hast du die ganzen Probleme nicht mehr, denn ich hab´ das Programm eben mal mit D7 (zwar Professional, aber das ist egal) getestet, und es funktionierte.
Ach ja: Ich habe meinen Server aufgeräumt. Wenn du das mit der XML-Datei online testen willst, dann hau sie bitte auf deinen Server und ändere die Konstante "szUrl" im Programm entsprechend.
|
|
GTA-Place
Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: So 04.04.04 18:58
Wollte die c't eh kaufen.
So wie du es gechrieben hats, gehts! THX
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 04.04.04 19:53
Freut mich.
Den Vorteil der Methode kannst du, denke ich, erkennen. Du kannst eine XML-Datei auf deinem Server benutzen um mehrere Programme, oder besser gesagt: Produkte, updaten zu lassen. Du musst sie nur aufzählen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| <?xml version="1.0" encoding="ISO-8859-1"?> <DOCTYPE products [ ... ]> <products> <product> <name>Dein Programm 1</name> <version>1.0.0.0</version> <url>http://www.blablabla.de/download.exe</url> </product> <product> <name>Dein Programm 2</name> <version>2.0.0.0</version> <url>http://www.blablabla.de/download2.exe</url> </product> </products> |
und wenn du im jeweiligen Updateprogramm den Namen angibst
Delphi-Quelltext 1: 2:
| const THISAPP = 'Dein Programm 2'; |
(und evtl. auch die Versionsnummer, falls das Updateprogramm nicht auch gleich das eigentliche Programm ist, das du aktualisieren willst), dann greift der XML-Code immer auf den Schlüssel zu und erkennt damit die Versionsnummer und den Downloadlink der auf dem Server liegenden Version.
Delphi-Quelltext 1: 2: 3: 4:
| node := xmldoc.selectSingleNode( '//products/product[name="' + THISAPP + '"]/version'); url := xmldoc.selectSingleNode( '//products/product[name="' + THISAPP + '"]/url'); |
Das halte ich persönlich für effizient, denn du kannst entweder den Updatecode in jedes deiner Programme übernehmen, oder du schreibst ein spezielles Updateprogramm, das dir als Basis dient und für jedes Programm quasi personalisiert wird. Aber auf dem Server liegt eben nur eine XML-Datei mit allen notwendigen Daten.
Is´ besser als mit RichEdits zu hantieren, usw.
|
|
Coder
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Fr 03.09.04 21:27
Downloaden funktioniert. Wie lese ich jetzt die geschwindigkeit und den status aus? (hab gesucht aber nix gefunden)
|
|