Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem beim Shutdown (https://www.delphipraxis.net/103029-problem-beim-shutdown.html)

FreakyF 8. Nov 2007 17:50


Problem beim Shutdown
 
Hallo!

Wie manche vielleicht schon von meinem anderen Beitrag wissen, versuche ich gerade mein erstes Shutdown-Programm zu schreiben.
Ich will die Idee von folgender Seite übernehmen: Link
Leider klappt die Umsetzung bei mir gar nicht :wall:

Hier mein Programm (soll erst später grafisch werden):

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function ExWindows(const AFlag: Word): Boolean;
var
  vi    : TOSVersionInfo;
  hToken : THandle;
  tp    : TTokenPrivileges;
  h     : DWord;
begin
  result:= false;

  vi.dwOSVersionInfoSize:=SizeOf(vi);

  if GetVersionEx(vi) then
  begin
    if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then
    begin
      // Windows NT
      // Achtung bei Delphi 2 muß @hToken stehen ...
      if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,hToken) then
      begin
        LookupPrivilegeValue(nil,'SeShutdownPrivilege',tp.Privileges[0].Luid);
        tp.PrivilegeCount := 1;
        tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        h := 0;
        AdjustTokenPrivileges(hToken,False,tp,0,PTokenPrivileges(nil)^, h);
        CloseHandle(hToken);
        result := ExitWindowsEx(Aflag, 0);
      end;
    end
    else
    begin // Windows 95
      Result := ExitWindowsEx(Aflag, 0);
    end;
  end;
end;


begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }
end.
Hier meine Fehlerliste:

Zitat:

[Pascal Fehler] Project1.dpr(10): E2003 Undefinierter Bezeichner: 'TOSVersionInfo'
[Pascal Fehler] Project1.dpr(12): E2003 Undefinierter Bezeichner: 'TTokenPrivileges'
[Pascal Fehler] Project1.dpr(13): E2003 Undefinierter Bezeichner: 'DWord'
[Pascal Fehler] Project1.dpr(17): E2066 Operator oder Semikolon fehlt
[Pascal Fehler] Project1.dpr(19): E2003 Undefinierter Bezeichner: 'GetVersionEx'
[Pascal Fehler] Project1.dpr(21): E2029 'THEN' erwartet, aber Bezeichner 'dwPlatformId' gefunden
[Pascal Fehler] Project1.dpr(25): E2003 Undefinierter Bezeichner: 'OpenProcessToken'
[Pascal Fehler] Project1.dpr(25): E2003 Undefinierter Bezeichner: 'GetCurrentProcess'
[Pascal Fehler] Project1.dpr(25): E2003 Undefinierter Bezeichner: 'TOKEN_ADJUST_PRIVILEGES'
[Pascal Fehler] Project1.dpr(27): E2003 Undefinierter Bezeichner: 'LookupPrivilegeValue'
[Pascal Fehler] Project1.dpr(27): E2066 Operator oder Semikolon fehlt
[Pascal Fehler] Project1.dpr(27): E2066 Operator oder Semikolon fehlt
[Pascal Fehler] Project1.dpr(38): E2003 Undefinierter Bezeichner: 'ExitWindowsEx'
[Pascal Fehler] Project1.dpr(41): E2029 '.' erwartet, aber ';' gefunden
Mein zweites Problem ist, dass ich nicht weiß, wie ich die Funktion in Hauptprogramm aufrufen kann.
Wo und wie muss ich den Parameter Flag EWX_Shutdown setzen?


Vielen vielen Dank für eure Hilfe :cheers:

DeddyH 8. Nov 2007 17:52

Re: Problem beim Shutdown
 
Es würde bestimmt schon einmal helfen, die Unit Windows in die uses-Klausel aufzunehmen.

FreakyF 8. Nov 2007 18:11

Re: Problem beim Shutdown
 
Zitat:

Zitat von DeddyH
Es würde bestimmt schon einmal helfen, die Unit Windows in die uses-Klausel aufzunehmen.

Oh mann wie blöd von mir...
Die Fehler sind alle weg.

Jetzt weiß ich leider noch nicht, wie ich die Funktion richtig aufrufen kann.
Und wo kann ich den Parameter Flag "EWX_Shutdown" setzen?

Danke :-D

DeddyH 8. Nov 2007 18:17

Re: Problem beim Shutdown
 
Zitat:

Zitat von FreakyF
Jetzt weiß ich leider noch nicht, wie ich die Funktion richtig aufrufen kann.
Und wo kann ich den Parameter Flag "EWX_Shutdown" setzen?

Z.B. so:
Delphi-Quellcode:
ExWindows(EWX_SHUTDOWN or EWX_FORCEIFHUNG);

FreakyF 8. Nov 2007 19:14

Re: Problem beim Shutdown
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von FreakyF
Jetzt weiß ich leider noch nicht, wie ich die Funktion richtig aufrufen kann.
Und wo kann ich den Parameter Flag "EWX_Shutdown" setzen?

Z.B. so:
Delphi-Quellcode:
ExWindows(EWX_SHUTDOWN or EWX_FORCEIFHUNG);

Vielen Dank für die super Hilfe!

Hier nochmal der komplette Quellcode:

Delphi-Quellcode:
program shutdown;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

function ExWindows(const AFlag: Word): Boolean;
var
  vi    : TOSVersionInfo;
  hToken : THandle;
  tp    : TTokenPrivileges;
  h     : DWord;
begin
  result:= false;

  vi.dwOSVersionInfoSize:=SizeOf(vi);

  if GetVersionEx(vi) then
  begin
    if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then
    begin
      // Windows NT
      // Achtung bei Delphi 2 muß @hToken stehen ...
      if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,hToken) then
      begin
        LookupPrivilegeValue(nil,'SeShutdownPrivilege',tp.Privileges[0].Luid);
        tp.PrivilegeCount := 1;
        tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        h := 0;
        AdjustTokenPrivileges(hToken,False,tp,0,PTokenPrivileges(nil)^, h);
        CloseHandle(hToken);
        result := ExitWindowsEx(Aflag, 0);
      end;
    end
    else
    begin // Windows 95
      Result := ExitWindowsEx(Aflag, 0);
    end;
  end;
end;


begin
  ExWindows(EWX_SHUTDOWN or EWX_FORCEIFHUNG);
end.

FreakyF 8. Nov 2007 22:01

Re: Problem beim Shutdown
 
Zitat:

Zitat von DeddyH
Es würde bestimmt schon einmal helfen, die Unit Windows in die uses-Klausel aufzunehmen.

Wie weiß man eigentlich, welche Units man braucht?

scrat1979 8. Nov 2007 22:17

Re: Problem beim Shutdown
 
Zitat:

Zitat von FreakyF
Zitat:

Zitat von DeddyH
Es würde bestimmt schon einmal helfen, die Unit Windows in die uses-Klausel aufzunehmen.

Wie weiß man eigentlich, welche Units man braucht?

Rechtsklick wenn MausCursor z.B. auf Variablen (also "TOSVersionInfo") -> Refactoring -> Unit suchen.
... hab ich im Forum vor ca. 10 Min. in einem anderen Thread gelesen :-)

SCRaT

P.S.: siehe auch MSDN-Library durchsuchenExitWindowsEx

Dezipaitor 9. Nov 2007 08:40

Re: Problem beim Shutdown
 
Kurze Frage:
Weißt du was OpenProcessToken und AdjustTokenPrivileges machen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 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