Entwickler-Ecke

Dateizugriff - Windows herunterfahren, (Problem gelöst)


kongreddgrass - Fr 29.08.03 21:34
Titel: Windows herunterfahren, (Problem gelöst)
Hi,
ich steh vor einem Problem.
Ich habe nur einen Button.
Wenn ich Windows herunterfahren will, betätige ich den Button und es soll herunterfahren. Nun ja, ich betätige es und es kommt eine Fehlermeldung,
aber Windows wird schon runtergefahren
Weiß jemand was?

Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
ExitWindowsEx (EWX_SHUTDOWN or EWX_POWEROFF, $FFFFFFFF);
end;


Gruß
Mike


Terra23 - Fr 29.08.03 21:39

Also Luckie würde dir jetzt seine Glaskugel um die Ohren hauen. Welche Meldung bekommst du denn?

Ich weiß im Moment nur eins: Wenn du die gleiche Funktion benutzt, auf die ich hier im Forum verwiesen wurde, dann sind deine Parameter verkehrt. Dann muß es entweder


Delphi-Quelltext
1:
ExistWindowsEX(EWX_SHUTDOWN);                    


oder


Delphi-Quelltext
1:
ExitWindowsEX(EWX_POWEROFF);                    


heißen. Wozu du den dritten Parameter eingebaut hast, ist mir schleierhaft, aber am Besten teilst du uns mal die Fehlermeldung mit und postest ggf. noch die Funktion ExitWindowsEx, so wie du sie in dein Programm integriert hast. Danke..


Christian S. - Fr 29.08.03 21:39

Ich habe die Funktion noch nie benutzt, jedoch steht im Platform SDK, dass der letzte Parameter einer der vorgegeben "Reason-Codes" sein muss. Für Dich würde wahrscheinlich "Application issue" passen:
SHTDN_REASON_MAJOR_APPLICATION

Wie gesagt, ausprobiert habe ich es nicht.

//Edit: das mit dem Reasencode scheint doch nciht so einfach zu sein. Sorry.


kongreddgrass - Fr 29.08.03 21:56

Ich habe jetzt bei mir das or und den Dollar+Dieses Zeichen weggemacht.
Jetzt funktionierts auf jeden Fall

Gruß
Mike


Delete - Fr 29.08.03 22:08

Der zweite Parameter wird aber bei OS kleiner XP ignoriert. Früher stand da:
Zitat:

Reserved for future use.


Terra23 - Fr 29.08.03 22:11

Also in den FAQ (der Beitrag von Tino) steht das zwar mit den F's aber da steht auch, daß das nur u.U. für XP von Bedeutung ist. Ich wurde damals auf einen Code verwiesen, da wurden diese Parameter nicht gebraucht und das du ein OR dazwischen gesetzt hast, ist einfach falsch. Entweder EWX_SHUTDOWN oder EWX_POWEROFF, wobei Shutdown den PC nur runterfährt und Poweroff auch den PC ausschaltet, sofern der PC das mit sich machen läßt. Das hätte aber in der Anleitung stehen müssen. Schau nochmal nach.

PS: Übrigens kannst du jetzt ein gelöst hinter deinen Thread setzen; schließlich ist er nicht ungelöst, wie jetzt noch dort steht.
PPS: Was machst du eigentlich noch hier? Ich denke, du bist in Urlaub..


Ex0rzist - Sa 30.08.03 18:34

Die Parameter können sehr wohl per or miteinander verknüpft werden.
Das kann man testen.
Starte ein Programm, dass beim Schliessen eine Meldung ausgibt (z.B. "Nichtgespeicherte Daten speichern?"). Dann probiere mal das aus:

Delphi-Quelltext
1:
ExitWindowsEx(EWX_SHUTDOWN,0);                    

Windows wird sich nicht herunterfahren, da das Programm beim Schliessen diese Frage zeigt und an Windows nicht das Ok zum Herunterfahren sendet.

Wenn du allerdingsExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE,0); verwendest, werden alle Anwendungen geschlossen und Windows wird anschliessend heruntergefahren.


Christian S. - Sa 30.08.03 19:09

Hallo, Ex0rzist!

Was Du schreibst, ist nur zum Teil richtig. Die Verknüpfung mit OR, welche Du gepostet hast, macht Sinn, denn der letzte Parameter ist ein optionaler Parameter.
Eine Verknüpfung von Werten, die in der Tabelle der nicht-optionalen Parameter stehen (wie im Code von kongreddgrass), macht keinen Sinn!

MfG
Peter


Ex0rzist - Sa 30.08.03 19:51

Hallo,

diese spezielle Verknüpfung ist in der Tat sinnlos, jedoch nicht falsch - wie Terra23 behauptet hat.


Christian S. - Sa 30.08.03 20:18

Okay, ja, da hast Du recht.

MfG
Peter


Terra23 - Sa 30.08.03 20:19

... in meinen Augen schon, denn es kann doch entweder das eine oder das andere gemacht werden und "OR" klingt, als könne sich der PC was aussuchen. Aber gut, dann ist es nicht falsch sondern ohne Sinn..


Christian S. - Sa 30.08.03 20:51

Das OR in diesem Fall ist ja auf Integer angewendet und nicht auf Wahrheitswerte (mal abgesehen von den Bits, die damit bearbeitet werden). EWX_SHUTDOWN or EWX_FORCE heißt ja auch nicht "runterfahren oder erzwingen".


Delete - Sa 30.08.03 21:27

@Terra: Müsstest du doch vielleicht von MessageBoxen kennen:

Delphi-Quelltext
1:
2:
3:
4:
MessageBox(self.Handle,
  'Hallo, Welt!',
  nil,
  MB_OK or MB_ICONINFORMATION);

Das or ist, wie Peter schon richtig schrieb, in dem Fall kein Vergleich, sondern bedeutet, dass die beiden Werte MB_OK und MB_ICONINFORMATION bitweise verknüpft werden. Und and not ist das Gegenstück davon.

Wieder was gelernt. :wink: Brauchst aber heute nicht in die Ecke ...


Delete - Sa 30.08.03 21:55

Na ja solange man seine Messageboxen so

Delphi-Quelltext
1:
2:
3:
4:
MessageBox(self.Handle, 
  'Hallo, Welt!'
  nil
  16);

erstellt spielt das doch keine Rolle. :roll:


Terra23 - Sa 30.08.03 22:21

Na gut, wieder was gelernt. Danke euch... :-)