Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Rechner per Software ausschalten (https://www.delphipraxis.net/49549-rechner-per-software-ausschalten.html)

Olli 13. Jul 2005 09:56

Re: Rechner per Software ausschalten
 
Zitat:

Zitat von marabu
Gib nicht auf - auch der Herbst hat noch schöne Tage.

:oops: sorry, ist wohl ein Mißverständnis. Bin noch unter 30 ... also kurz vor der Arbeitslosenrente ALG2 :mrgreen: ... ich meinte, daß Win9x zu alt sei. Allerdings ist das eine Ausrede - es ist mir eigentlich zu instabil und zu schwer zu pflegen (nicht viel was man automatisieren könnte).

orabimus 14. Jul 2005 09:09

Re: Rechner per Software ausschalten
 
Zitat:

Zitat von Olli
@marabu: Das ist eigentlich nur für BlueScreens (Bugchecks) gedacht. Hat nix mit EWX zu tun.

Rechtsklick auf den Desktop -> Bildschirmschoner -> Energierverwaltung

oder alternativ

Windows + R -> "control powercfg.cpl"

Dort gibt es bei älteren PCs sowas wie "APM aktivieren". Habe leider keinen solchen PC hier, erinnere mich aber daran dieses Problem selbst gehabt zu haben.

Aber Gegenfrage: Wie sieht es aus, wenn du beim Startmenü auswählst, daß der Rechner runterfahren soll? Geht's dann? Es gibt nämlich 3 Varianten:
1. Der Rechner wird abgeschaltet
2. Der Rechner fährt runter und zeigt an, daß er abgeschaltet werden darf
3. Der Rechner bootet neu (bei fehlerhafter Konfiguration!!!)


@dahead: Ruhezustand ist deaktiviert, beim Runterfahren wird nichts gelöscht.

@olli: 2. trifft bei mir zu.

Vielen Dank für die Tipps bisher.

mfg

Luckie 14. Jul 2005 09:17

Re: Rechner per Software ausschalten
 
Es ist auch ein ATX Board drinne oder? :gruebel:

DevilsCamp 14. Jul 2005 09:53

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:
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;
Sollte es aus irgendeinem Grund nicht möglich sein, den Neustart auszuführen, dann wird auch gleich die Fehlermeldung ausgegeben.

Olli 14. Jul 2005 10:53

Re: Rechner per Software ausschalten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von orabimus
@olli: 2. trifft bei mir zu.

In diesem Fall mußt du APM aktivieren. Siehe Anhang (hatte Zugang zu einem solchen älteren Rechner). Sollte der gezeigte Reiter nicht angezeigt werden, so ist es u.U. nötig die korrekten Chipsatztreiber zu installieren.

@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:
AdjustTokenPrivileges(hToken, false, tp, 0, PTokenPrivileges(nil), h);
Mal sehen wie gut du deine Funktion kennst.

DevilsCamp 14. Jul 2005 11:01

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:
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
   );
Ich zähle hier 6 Parameter. In meinem Code übergebe ich der Funktion ebenfalls 6 Parameter, wo also soll die Anzahl NICHT übereinstimmen?

Olli 14. Jul 2005 11:44

Re: Rechner per Software ausschalten
 
Zitat:

Zitat von DevilsCamp
Aber ich denke, dass es evtl. an seinem Quellcode liegen könnte.

Laut den beschriebenen Symptomen kann dies nicht der Fall sein.

Zitat:

Zitat von DevilsCamp
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

Meinereiner benutzt Delphi 4. Hier die Deklaration der Funktion aus windows.pas in D4:
Delphi-Quellcode:
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
  const NewState: TTokenPrivileges; BufferLength: DWORD;
  var PreviousState: TTokenPrivileges; var ReturnLength: DWORD): BOOL; stdcall;
Zitat:

Zitat von DevilsCamp
Ich zähle hier 6 Parameter. In meinem Code übergebe ich der Funktion ebenfalls 6 Parameter, wo also soll die Anzahl NICHT übereinstimmen?

Es geht nicht um die Anzahl sondern um "Typen" und "formale var-Parameter", siehe Fehlermeldung. Siehe vorletzter Parameter :zwinker:.

DevilsCamp 14. Jul 2005 11:57

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]

Olli 14. Jul 2005 12:02

Re: Rechner per Software ausschalten
 
Zitat:

Zitat von DevilsCamp
Da ich erstens Delphi4 übersprungen habe und zweitens beruflich nur mit Delphi7 arbeite, kann es durchaus sein, dass es mit Delphi4 nicht geht ;)

Die Lösung müßtest du aber kennen, gerade als professioneller (im Sinne von beruflicher) Programmierer:
Delphi-Quellcode:
AdjustTokenPrivileges(hToken, false, tp, 0, PTokenPrivileges(nil)^, h);
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).

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.

orabimus 15. Jul 2005 04:45

Re: Rechner per Software ausschalten
 
Zitat:

Zitat von Olli
Zitat:

Zitat von orabimus
@olli: 2. trifft bei mir zu.

In diesem Fall mußt du APM aktivieren. Siehe Anhang (hatte Zugang zu einem solchen älteren Rechner). Sollte der gezeigte Reiter nicht angezeigt werden, so ist es u.U. nötig die korrekten Chipsatztreiber zu installieren.

@Olli: Der Reiter ist bei mir unter Win2k nicht da, daran wirds bei mir dann wohl liegen, vielen Dank!

@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.
Seite 2 von 4     12 34      

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