AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Windows beenden und dabei Updates installieren
Thema durchsuchen
Ansicht
Themen-Optionen

Windows beenden und dabei Updates installieren

Ein Thema von TUX_der_Pinguin · begonnen am 22. Jul 2015 · letzter Beitrag vom 2. Dez 2015
Antwort Antwort
Seite 1 von 2  1 2      
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#1

Windows beenden und dabei Updates installieren

  Alt 22. Jul 2015, 14:46
Hallo DPler,

ich habe in meinem Programm (Kiosk-Anwendung) den Punkt Beenden, hierbei soll der Rechner heruntergefahren werden. Bisher habe ich das mit ShellExecute() und "shutdown -s -f -t 0" realisiert.
Dabei ist mir jedoch aufgefallen das keine Updates installiert werden falls welche heruntergeladen wurden.
Die Windows Update Einstellungen stehen auf "Updates herunterladen, aber Installation manuell durchführen". Es sollen nämlich die Updates erst beim Beenden installiert werden.

Jetzt habe ich im internet und auch hier im Forum gesucht und bin auf einen Thread von devidespe gestoßen der genau das Gegenteil wollte, nämlich herunterfahren ohne die Installation von Updates.

Also dachte ich mir nehme ich doch den Code und alles wäre geritzt aber nix da der Rechner fährt direkt runter.
Delphi-Quellcode:
function WindowsShutDown(Computer : string; Msg : string; Time: Word; Force : Boolean; Reboot: Boolean) : Boolean;
var rl, hToken : Cardinal;
    tkp : TOKEN_PRIVILEGES;
begin
  Result:=False;
  if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
  ShowMessage('Fehler beim Windows-Shutdown aufgetreten.') else
  begin
    if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
    begin
      tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
      tkp.PrivilegeCount:=1;
      AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
      if GetLastError <> ERROR_SUCCESS then
      ShowMessage('Fehler beim Windows-Shutdown aufgetreten.') else
      begin
        Result:=InitiateSystemShutdown(PChar(Computer), PChar(Msg), Time, Force, Reboot);
        if Result = False then
        ShowMessage('Fehler beim Windows-Shutdown aufgetreten.');
      end;
    end else ShowMessage('Fehler beim Windows-Shutdown aufgetreten.');
  end;
end;
Jetzt ging es in dem Thread weiter und Jemand schlug die Funktion InitiateShutdown() vor mit dem Flag SHUTDOWN_INSTALL_UPDATES.

Mir gelingt es jedoch einfach nicht diese Funktion zu implementieren.
Delphi-Quellcode:
const
  SHUTDOWN_FORCE_OTHERS = $00000001;
  SHUTDOWN_FORCE_SELF = $00000002;
  SHUTDOWN_GRACE_OVERRIDE = $00000020;
  SHUTDOWN_HYBRID = $00000200;
  SHUTDOWN_INSTALL_UPDATES = $00000040;
  SHUTDOWN_NOREBOOT = $00000010;
  SHUTDOWN_POWEROFF = $00000008;
  SHUTDOWN_RESTART = $00000004;
  SHUTDOWN_RESTARTAPPS = $00000080;

type
  function InitiateShutdown(lpMachineName, lpMessage: LPWSTR; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;

implementation

  function InitiateShutdown; external advapi32 name 'InitiateShutdown';
Die Entwicklung geschieht in Delphi 2009 unter Windows XP, die Software wird jedoch nur auf Windows 7 Rechner eingesetzt.

Hat jemand eine Idee was ich falsch mache bzw. eine Idee woran es liegen kann das man beim herunterfahren die Updates nicht installiert werden?
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

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

AW: Windows beenden und dabei Updates installieren

  Alt 22. Jul 2015, 15:02
Mir gelingt es jedoch einfach nicht diese Funktion zu implementieren.
Wie und wo hast du denn den Aufruf von InitiateShutdown in Deinem Code drinstehen und welche Fehlermeldungen hattest du dadurch?
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Windows beenden und dabei Updates installieren

  Alt 22. Jul 2015, 15:32
Ich habe den Fehler selbst schon gefunden, die function 'InitiateShutdown' existiert nicht in der Advapi32.dll sondern nur die beiden Ansi und Unicode varianten 'InitiateShutdownA' und 'InitiateShutdownW'.

Mit folgender Implementierung hat es geklappt, und scheinbar werden jetzt auch die Updates beim Beenden installiert.
Delphi-Quellcode:
const
  SHUTDOWN_FORCE_OTHERS = $00000001;
  SHUTDOWN_FORCE_SELF = $00000002;
  SHUTDOWN_GRACE_OVERRIDE = $00000020;
  SHUTDOWN_HYBRID = $00000200;
  SHUTDOWN_INSTALL_UPDATES = $00000040;
  SHUTDOWN_NOREBOOT = $00000010;
  SHUTDOWN_POWEROFF = $00000008;
  SHUTDOWN_RESTART = $00000004;
  SHUTDOWN_RESTARTAPPS = $00000080;

type
  TInitiateShutdown = function(
  {$IFDEF UNICODE}
    lpMachineName, lpMessage: PWideChar;
  {$ELSE}
    lpMachineName, lpMessage: PAnsiChar;
  {$ENDIF}
    dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;
 
function InitiateShutdownA(lpMachineName, lpMessage: PAnsiChar; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;
function InitiateShutdownW(lpMachineName, lpMessage: PWideChar; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;


var
InitiateShutdown: TInitiateShutdown =
  {$IFDEF UNICODE}
    InitiateShutdownW;
  {$ELSE}
    InitiateShutdownA;
  {$ENDIF}

implementation

function InitiateShutdownA; external advapi32 name 'InitiateShutdownA';
function InitiateShutdownW; external advapi32 name 'InitiateShutdownW';
Mal schauen welche Überraschung Windows noch bereit behält
  Mit Zitat antworten Zitat
zagota

Registriert seit: 3. Sep 2014
38 Beiträge
 
#4

AW: Windows beenden und dabei Updates installieren

  Alt 22. Jul 2015, 15:34
Hallo DPler,
function InitiateShutdown; external advapi32 name 'InitiateShutdown';[/DELPHI]Die Entwicklung geschieht in Delphi 2009 unter Windows XP,
In der Hilfe steht: Requires Windows Vista.

cu
  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
 
#5

AW: Windows beenden und dabei Updates installieren

  Alt 22. Jul 2015, 15:47
Hallo DPler,
function InitiateShutdown; external advapi32 name 'InitiateShutdown';[/DELPHI]Die Entwicklung geschieht in Delphi 2009 unter Windows XP,
In der Hilfe steht: Requires Windows Vista.

cu
Das macht doch nichts, denn die Software wird ja nur auf Systemen mit Win7 genutzt
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 Sir Rufo
Sir Rufo

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

AW: Windows beenden und dabei Updates installieren

  Alt 22. Jul 2015, 15:49
@TUX_der_Pinguin

Schau doch mal in deinem Delphi in der Windows Unit nach, wie Emba diese Umleitung der API-Calls macht (Ansi/Unicode). Das ist dort wesentlich eleganter gelöst
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
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Windows beenden und dabei Updates installieren

  Alt 22. Jul 2015, 16:27
@TUX_der_Pinguin

Schau doch mal in deinem Delphi in der Windows Unit nach, wie Emba diese Umleitung der API-Calls macht (Ansi/Unicode). Das ist dort wesentlich eleganter gelöst
Vielen dank für den Tipp Sir Rufo, dass wirkt in der Tat etwas eleganter

Delphi-Quellcode:
function InitiateShutdown(lpMachineName, lpMessage: PWideChar; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;
{$EXTERNALSYM InitiateShutdown}
function InitiateShutdownA(lpMachineName, lpMessage: PAnsiChar; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;
{$EXTERNALSYM InitiateShutdownA}
function InitiateShutdownW(lpMachineName, lpMessage: PWideChar; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;
{$EXTERNALSYM InitiateShutdownW}

implementation

function InitiateShutdown; external advapi32 name 'InitiateShutdownW';
function InitiateShutdownA; external advapi32 name 'InitiateShutdownA';
function InitiateShutdownW; external advapi32 name 'InitiateShutdownW';
  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
 
#8

AW: Windows beenden und dabei Updates installieren

  Alt 22. Jul 2015, 16:57
Ich würde es noch so abändern:
Delphi-Quellcode:
function InitiateShutdown(lpMachineName, lpMessage: PChar {PWideChar}; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;
{$EXTERNALSYM InitiateShutdown}
function InitiateShutdownA(lpMachineName, lpMessage: PAnsiChar; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;
{$EXTERNALSYM InitiateShutdownA}
function InitiateShutdownW(lpMachineName, lpMessage: PWideChar; dwGracePeriode, dwShutdownFlags, dwReason: DWORD): DWORD; stdcall;
{$EXTERNALSYM InitiateShutdownW}

implementation

function InitiateShutdown; external advapi32 name {$IFDEF UNICODE}'InitiateShutdownW'{$ELSE}'InitiateShutdownA'{$ENDIF};
function InitiateShutdownA; external advapi32 name 'InitiateShutdownA';
function InitiateShutdownW; external advapi32 name 'InitiateShutdownW';
Und jetzt hat man eine automatische Umleitung bei der Verwendung von InitiateShutdown();
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
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Windows beenden und dabei Updates installieren

  Alt 22. Jul 2015, 17:21
Ich habe bis heute nie verstanden was das für einen Sinn macht die Deklarationen in zwei Teile (Interface und implementation) aufzusplitten. Warum macht man das?
  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
 
#10

AW: Windows beenden und dabei Updates installieren

  Alt 22. Jul 2015, 18:09
Weil man es kann

Hat wohl eher etwas mit der Übersichtlichkeit zu tun wenn das ; external advapi32 name 'InitiateShutdownA'; nicht auch noch in der Zeile steht.

Ansonsten ist es wurscht ...
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
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 13:17 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