AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Delphi-PRAXiS - Lounge Betriebssysteme Rechner per Software ausschalten
Thema durchsuchen
Ansicht
Themen-Optionen

Rechner per Software ausschalten

Ein Thema von orabimus · begonnen am 12. Jul 2005 · letzter Beitrag vom 5. Aug 2005
Antwort Antwort
Seite 2 von 4     12 34      
Olli
(Gast)

n/a Beiträge
 
#11

Re: Rechner per Software ausschalten

  Alt 13. Jul 2005, 10:56
Zitat von marabu:
Gib nicht auf - auch der Herbst hat noch schöne Tage.
sorry, ist wohl ein Mißverständnis. Bin noch unter 30 ... also kurz vor der Arbeitslosenrente ALG2 ... 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).
  Mit Zitat antworten Zitat
orabimus
(Gast)

n/a Beiträge
 
#12

Re: Rechner per Software ausschalten

  Alt 14. Jul 2005, 10:09
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Rechner per Software ausschalten

  Alt 14. Jul 2005, 10:17
Es ist auch ein ATX Board drinne oder?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#14

Re: Rechner per Software ausschalten

  Alt 14. Jul 2005, 10:53
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.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#15

Re: Rechner per Software ausschalten

  Alt 14. Jul 2005, 11:53
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 ... 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:AdjustTokenPrivileges(hToken, false, tp, 0, PTokenPrivileges(nil), h); Mal sehen wie gut du deine Funktion kennst.
Miniaturansicht angehängter Grafiken
apm_108.png  
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#16

Re: Rechner per Software ausschalten

  Alt 14. Jul 2005, 12:01
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?
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#17

Re: Rechner per Software ausschalten

  Alt 14. Jul 2005, 12:44
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 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 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 .
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#18

Re: Rechner per Software ausschalten

  Alt 14. Jul 2005, 12:57
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]
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#19

Re: Rechner per Software ausschalten

  Alt 14. Jul 2005, 13:02
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: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.
  Mit Zitat antworten Zitat
orabimus
(Gast)

n/a Beiträge
 
#20

Re: Rechner per Software ausschalten

  Alt 15. Jul 2005, 05:45
Zitat von Olli:
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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:51 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