![]() |
Re: Rechner per Software ausschalten
Zitat:
|
Re: Rechner per Software ausschalten
Zitat:
@dahead: Ruhezustand ist deaktiviert, beim Runterfahren wird nichts gelöscht. @olli: 2. trifft bei mir zu. Vielen Dank für die Tipps bisher. mfg |
Re: Rechner per Software ausschalten
Es ist auch ein ATX Board drinne oder? :gruebel:
|
Re: Rechner per Software ausschalten
So hier mal eine Prozedur, die Windows herunterfährt bzw. neu startet.
Sie ist so geschrieben, dass sie sowohl mit Win9x als auch mit Win2000/XP funktioniert.
Delphi-Quellcode:
Sollte es aus irgendeinem Grund nicht möglich sein, den Neustart auszuführen, dann wird auch gleich die Fehlermeldung ausgegeben.
procedure BeendeWindows(Restart: Boolean);
var vi : TOSVersionInfo; hToken : THandle; tp : TTokenPrivileges; h : DWORD; i : Boolean; buffer : PChar; o : Integer; begin vi.dwOSVersionInfoSize := sizeof(vi); GetVersionEx(vi); if vi.dwPlatformId=VER_PLATFORM_WIN32_NT then begin OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken); 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); end; if restart then i := ExitWindowsEx(EWX_REBOOT, 0) else i := ExitWindowsEx(EWX_POWEROFF, 0); h := GetLastError; GetMem(buffer, 1024); o := FORMAT_MESSAGE_FROM_HMODULE; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, @o, h, 0, buffer, 1023, nil); FreeMem(Buffer); end; |
Re: Rechner per Software ausschalten
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
@DevilsCamp: Ich denke du hast die Frage nicht durchgelesen :roll: ... und außerdem kompiliert deine tolle Funktion nicht, wie kann das sein? -> Types of actual and formal var parameters must be identical ... in folgender Zeile:
Delphi-Quellcode:
Mal sehen wie gut du deine Funktion kennst.
AdjustTokenPrivileges(hToken, false, tp, 0, PTokenPrivileges(nil), h);
|
Re: Rechner per Software ausschalten
Doch hab ich.
Aber ich denke, dass es evtl. an seinem Quellcode liegen könnte. Daher habe ich eine Prozedur gepostet, mit der es unter Win2000 KEINEN Neustart, sondern den gewünschten Shutdown gibt. Es Versuch ist es jedenfalls wert... Und bei mir wird diese Funktion sowohl unter Delphi 7 als auch unter Delphi 2005 ohne Fehler kompiliert (ich habe sogar den kompletten QuellCode von hier gepastet [edit] Auszug aus der Delphi-Win32-Hilfe:
Code:
Ich zähle hier 6 Parameter. In meinem Code übergebe ich der Funktion ebenfalls 6 Parameter, wo also soll die Anzahl NICHT übereinstimmen?
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // handle to token that contains privileges BOOL DisableAllPrivileges, // flag for disabling all privileges PTOKEN_PRIVILEGES NewState, // pointer to new privilege information DWORD BufferLength, // size, in bytes, of the PreviousState buffer PTOKEN_PRIVILEGES PreviousState, // receives original state of changed privileges PDWORD ReturnLength // receives required size of the PreviousState buffer ); |
Re: Rechner per Software ausschalten
Zitat:
Zitat:
Delphi-Quellcode:
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
const NewState: TTokenPrivileges; BufferLength: DWORD; var PreviousState: TTokenPrivileges; var ReturnLength: DWORD): BOOL; stdcall; Zitat:
|
Re: Rechner per Software ausschalten
Da ich erstens Delphi4 übersprungen habe und zweitens beruflich nur mit Delphi7 arbeite, kann es durchaus sein, dass es mit Delphi4 nicht geht ;)
Und wegen APM: Auf einem Rechner ohne ACPI (bzw. ausgeschaltetem) haben EWX_POWEROFF und EWX_SHUTDOWN die selbe Funktion: Herunterfahren von Windows mit manuellem Ausschalten. @orabimus Welche Version besitzt Du eigentlich? Haben bei dir EWX_POWEROFF bzw. EWX_SHUTDOWN vllt. zufälligerweise den gleichen Wert wie EWX_REBOOT (aus welchen Gründen auch immer)? [edit] @Olli: hier meine Deklaration:
Delphi-Quellcode:
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
const NewState: TTokenPrivileges; BufferLength: DWORD; var PreviousState: TTokenPrivileges; var ReturnLength: DWORD): BOOL; stdcall; overload; {$EXTERNALSYM AdjustTokenPrivileges} function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; const NewState: TTokenPrivileges; BufferLength: DWORD; PreviousState: PTokenPrivileges; var ReturnLength: DWORD): BOOL; stdcall; overload; {$EXTERNALSYM AdjustTokenPrivileges} [/edit] |
Re: Rechner per Software ausschalten
Zitat:
Delphi-Quellcode:
Das wird auch bei manch anderer Deklaration gebraucht, wenn ursprünglich ein Pointertyp übergeben wurde, dies aber als var ohne Pointertyp übersetzt wurde (Thema: Headerkonvertierung).
AdjustTokenPrivileges(hToken, false, tp, 0, PTokenPrivileges(nil)^, h);
ACPI ist sehr spezifisch. Mit ACPI hat es nicht viel zu tun. APM ist nicht ACPI - und es geht dennoch ;) ... dann wären noch APIC und andere Varianten vorhanden. Siehe deine verfügbaren HALs. |
Re: Rechner per Software ausschalten
Zitat:
@DevilsCamp: Delphi 5, falls Du das mit der Version meintest. Wie schon geschrieben, zeigen bei mir alle (Fremd-) Tools unter Win2k den gleichen Effekt, der Rechner wird statt herunterzufahren immer neu gestartet. mfg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 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