Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Update Komponente


chickenfigt1989 - Mo 11.10.10 20:46
Titel: Update Komponente
Hallo
hab ne update komponente die auch wunderbar funktioniert.
allerdings ladet die nur das Update runter.
Ich will aber das dass Programm geschloßen wird, und das Update gestartet wird.

Wie realisier ich das??
mfg


elundril - Mo 11.10.10 20:50

Setz einfach das Feld "CloseOnUpdate" auf True. :roll:

Merkst du was? Wir können dir nix darüber sagen wenn wir nicht wissen was für eine Komponente du verwendest und wie du sie verwendest... Immer wieder das selbe spiel mit dir.

lg elundril


chickenfigt1989 - Mo 11.10.10 20:56

Sorry hab vergessen zu erwähnen das es eine selbst geschriebene Komponente ist.
Hab die komponente mal als Anhang dazugepackt

mfg


jaenicke - Mo 11.10.10 21:08

Wie sowas funktioniert kannst du bei meiner Update Komponente [http://www.delphi-forum.de/viewtopic.php?t=94339] schauen. Du kannst z.B. dein eigenes Programm mit entsprechenden Parametern starten, damit das das Update durchführt.

Was mir auf den ersten Blick erst einmal im Quelltext auffällt: Dein Admin-Check dürfte so nicht immer funktionieren. Hast du den einmal unter Vista / 7 ausprobiert?
Es gibt da ab XP eine viel viel einfachere Möglichkeit schon im System. Die Funktion IsUserAnAdmin nämlich...
http://msdn.microsoft.com/en-us/library/bb776463(VS.85).aspx
Die funktioniert auch mit UAC usw. korrekt.


chickenfigt1989 - Mo 11.10.10 21:10

Oke Danke werd ich mir Morgen bei gelegenheit anschauen.

Also bei mein Pc hab ich Vista drauf und da gehts, aber ich schaus mir trotzdem an und werds ggf ändern

lg


jaenicke - Mo 11.10.10 21:55

Wenn du per UAC Adminrechte angefordert hast, geben diese Quelltexte meistens trotzdem "kein Admin" zurück. Man kann es schon so machen, aber der sah mir nicht danach aus. ;-)

Abgesehen davon ist der andere fast nur eine Zeile.


Delete - Mo 11.10.10 22:38

Man beachte aber den Reamarks-Abschnitt:
Zitat:
Remarks

This function is a wrapper for CheckTokenMembership. It is recommended to call that function directly to determine Administrator group status rather than calling IsUserAnAdmin.

Note This function is available through Windows Vista. It might be altered or unavailable in subsequent versions of Windows.


Besser sind wohl Nicos TokenTools -> http://www.michael-puff.de/Programmierung/Delphi/Importe/Nico/


BenBE - Mo 11.10.10 23:43

Und ohne jetzt mir deinen Source angeguckt zu haben: Du wirst sicherlich so nahezu ALLE gängigen Sicherheitsprüfungen (Integrität, Authentizitätscheck, Authoritätscheck) NICHT umgesetzt haben. Bevor ich mich also jetzt wiederhole, schau einfach mal hier im Forum nach dem, was ich bereits zu anderen Updatern geschrieben hab. Und wenn Du das nicht umsetzen kannst, solltest Du einen verwenden, der das bereits alles hat.


chickenfigt1989 - Di 12.10.10 13:00

Dann schau dir doch einfach mal meine Update Komponente an.
Ich bräuchte auch nur den Befehl um das Programm zu schließen das war glaub ich irgendwas mit Application.Terminate oder so und dann ein Befehl der die heruntergeladene Version startet. Und wo soll ich das dann hinschreiben?

Mfg


Flamefire - Di 12.10.10 13:22

Dann lies mal was BenBE geschrieben hat... Deine Komponente hat nichts davon.


chickenfigt1989 - Di 12.10.10 13:24

Das weiß er ja nicht da er sich den Sourcecode nicht angeschaut hat.


Dude566 - Di 12.10.10 13:50

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die Funktion IsUserAnAdmin nämlich...
http://msdn.microsoft.com/en-us/library/bb776463(VS.85).aspx
Die funktioniert auch mit UAC usw. korrekt.


Muss ich da etwa eine dll für einbinden, denn mein Turbo Delphi kennt diese Methode nicht. Ich dachte zuerst ich müsse WinAPI unter "uses" einfügen, hat aber auch nichts gebracht.


jaenicke - Di 12.10.10 15:17

Die musst du fix wie in MSDN zu sehen deklarieren. (Du findest das auch in meinem Registryeditor.)


ALF - Di 12.10.10 15:28

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Sorry hab vergessen zu erwähnen das es eine selbst geschriebene Komponente ist.
Hab die komponente mal als Anhang dazugepackt

mfg

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Dann schau dir doch einfach mal meine Update Komponente an.
Ich bräuchte auch nur den Befehl um das Programm zu schließen das war glaub ich irgendwas mit Application.Terminate oder so und dann ein Befehl der die heruntergeladene Version startet. Und wo soll ich das dann hinschreiben?

Mfg
ab hier würde ich sagen, das Du nicht den Updatergeschrieben hast!!!! sonst wüsstest Du wie wo und was!
Gruss ALf


Dude566 - Di 12.10.10 15:45

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die musst du fix wie in MSDN zu sehen deklarieren. (Du findest das auch in meinem Registryeditor.)



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TmainForm.btnCheckUserForAdminClick(Sender: TObject);
type
  TIsUserAnAdminFunc = function (): BOOL; stdcall;
var
  Shell32DLL: THandle;
  IsUserAnAdminFunc: TIsUserAnAdminFunc;
begin
  Shell32DLL := LoadLibrary('shell32.dll');
  try
    if Shell32DLL <> 0 then
    begin
      @IsUserAnAdminFunc := GetProcAddress(Shell32DLL, 'IsUserAnAdmin');
      if Assigned(@IsUserAnAdminFunc) then
        if IsUserAnAdminFunc then
          ShowMessage('Sie haben Adminrechte.');
    end;
  finally
    FreeLibrary(Shell32DLL);
  end;
end;


Das habe ich jetzt mal von deinem Sourcecode abgewandelt und es scheint zu funktionieren, ich bekomme die ShowMessage.
Habe leider kein eingeschränktes Nutzerkonto zur Hand um mich vom Gegenteil zu überzeugen.

Edit: Code korrigiert und erfolgreich getestet, hat man Adminrechte erscheint eine Nachricht, andernfalls keine.


elundril - Di 12.10.10 20:05

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Dann schau dir doch einfach mal meine Update Komponente an.
Ich bräuchte auch nur den Befehl um das Programm zu schließen das war glaub ich irgendwas mit Application.Terminate oder so und dann ein Befehl der die heruntergeladene Version startet. Und wo soll ich das dann hinschreiben?

Mfg


Application.Terminate ist böse, böse, böse, böse (Afaik)! Zum beenden kann man einfach die Close-Methode im Hauptformular aufrufen. Dann kannst du davor im OnCloseQuery deinen Updater mit Shellexecute starten (wenn der Updater ein eigenes Programm ist). Ist er kein eigenes Programm, wirds etwas schwieriger weil du ja die alte EXE ersetzen musst, was nicht geht wenn sie noch läuft.

lg elundril


chickenfigt1989 - Di 12.10.10 20:15

habs hinbekommen


jaenicke - Di 12.10.10 20:22

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Application.Terminate ist böse, böse, böse, böse (Afaik)! Zum beenden kann man einfach die Close-Methode im Hauptformular aufrufen.
In diesem Fall hast du da was verwechselt. ;-)

Application.Terminate wird auch durch das Schließen des Hauptformulars aufgerufen (oder wenn WM_QUIT empfangen wird), deshalb endet dann auch das Programm. Es wird aber ordentlich beendet.

Böse sind Befehle wie Halt. ;-)

// EDIT:
Nach kurzem Chat mit Michael und einem kurzen Test noch als Ergänzung:
Application.Terminate überspringt OnClose und OncloseQuery. Die Anwendung wird aber sauber beendet, d.h. OnDestroy wird ausgeführt.


Delete - Di 12.10.10 21:32

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Nach kurzem Chat mit Michael und einem kurzen Test noch als Ergänzung:
Application.Terminate überspringt OnClose und OncloseQuery. Die Anwendung wird aber sauber beendet, d.h. OnDestroy wird ausgeführt.

Das war aber nicht ich, aber ich hätte dir das selbe gesagt. ;)


elundril - Di 12.10.10 21:35

*Aufzeig* Jap, ich war das bitte. Der Ersatz-Michael. ;)

lg elundril


Delete - Di 12.10.10 21:40

Ach du heißt auch so? Dann mache mir keine Schande. ;)


jaenicke - Mi 13.10.10 04:41

Steht doch sogar fett gedruckt unter seinen Beiträgen. :mrgreen: