Einzelnen Beitrag anzeigen

Lefko

Registriert seit: 31. Jul 2003
359 Beiträge
 
Delphi 6 Enterprise
 
#1

ExitWindowEx funktioniert einfach nicht mehr....

  Alt 15. Feb 2004, 21:33
Hallo Freunde ,

ich versteh die Welt nicht mehr!

Bisher hat mein Shutdown-Programm (abgesehen von ein paar Ausnahmen wegen Aufhängens seitens NAV ) immer einwandfrei funktioniert!

Jetzt habe ich ein bisschen Code für das Schreiben der Log-Datei geändert und es GEHT NICHT MEHR!

Hier der Code:

Delphi-Quellcode:
procedure TForm1.TiShutdownTimer(Sender: TObject);
var f : textfile;
    ConnDetails : TRASConnectionDetails;
    Upload, Download, Trennung, SDVerlauf, Volumen : string;
begin
TiShutdown.Enabled := false;
TiCount.Enabled := false;
Upload := '';
Download := '';
Trennung := '';
SDVerlauf := '';
Volumen := '';

//evtl. Verbindung trennen
try
  if InternetGetConnectedState(nil, 0) then
    begin
     RasMonitor.GetRasConnection(ConnDetails);
     RasMonitor.HangUpRasConnection(Conndetails.RasConn);
     sleep(1500);
     getrennt := not InternetGetConnectedState(nil, 0);
     if not InternetGetConnectedState(nil, 0) and getrennt
       then Trennung := 'Internetverbindung getrennt.'
       else Trennung := 'Internetverbindung konnte nicht getrennt werden!';

     //evtl. Datenvolumen & Onlinezeit bekommen
     if (GetSessionTraffic('In') / 1024 > 1024)
       then Download := 'Download: ' + FormatFloat('0.00', GetSessionTraffic('In') / 1024 / 1024) + ' Mb'
       else Download := 'Download: ' + FormatFloat('#,##0.00', GetSessionTraffic('In') / 1024) + ' Kb';

     if (GetSessionTraffic('Out') / 1024 > 1024)
       then Upload := 'Upload: ' + FormatFloat('0.00', GetSessionTraffic('Out') / 1024 / 1024) + ' Mb'
       else Upload := 'Upload: ' + FormatFloat('#,##0.00', GetSessionTraffic('Out') / 1024) + ' Kb';

     Volumen := ' (' + Upload + '; ' + Download + ')';
     Trennung := Trennung + Volumen;
    end;
except
  Trennung := 'Internetverbindung konnte nicht getrennt werden!';
end;

  (*---------Onlinezeit fehlt noch-----------*)

//Logfile schreiben
SDVerlauf := 'Shutdown am '+ DatetoStr(IncSecond(now)) + ' um ' + TimeToStr(now) + ' erfolgreich ausgeführt. ';
assignfile(f, ExtractFilePath(Application.exename) + 'Shutdown.log');
if FileExists(ExtractFilePath(Application.exename) + 'Shutdown.log')
  then append(f)
  else rewrite(f);
writeln(f, (SDVerlauf + Trennung));
writeln(f, '');
closefile(f);

//Keinen Beenden-Dialog anzeigen
Normalclose := true;

//Windows_Shutdown;
ExitWin(EWX_POWEROFF or EWX_FORCE);
end;
und hier der Code von ExitWin:

Delphi-Quellcode:
function Tform1.ExitWin(Flag : word) : Boolean;
var Version : TOSVersionInfo;
    hToken : THandle;
    TP : TTokenPrivileges;
    h : DWord;
begin
Version.dwOSVersionInfoSize := SizeOf(Version);
GetVersionEx(Version);
if Version.dwPlatformId = VER_PLATFORM_WIN32_NT
  then // Windows NT
   begin
    //Rechte holen
                     {Achtung bei Delphi 2 muß @hToken stehen ...}
    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);

    result := ExitWindowsEx(Flag, 0);
   end
  else // Windows 9x/ME
   begin
    result := ExitWindowsEx(Flag, 0);
   end;
end;
Ich bin mir da auch mit den Parametern etwas unsicher; bisher habe ich immer "EWX_SHUTDOWN or EWX_FORCE" benutzt, um den Computer herunterzufahren und auch auszuschalten (hat auch funktioniert), aber in der MSDN steht, EWX_SHUTDOWN sei nur zum Herunterfahren bis zu einem Punkt, an dem der PC sicher ausgeschaltet werden könne
Trotzdem hat es immer damit funktioniert!
JETZT funktioniert dieses Flag so, wie es soll: Der PC beendet die Windows-Session und der Bildschirm wird so schwarz und dieser _ blinkt, wie zur Eingabe in DOS (also scheint das dieser Punkt zu sein, an dem ich den PC sicher ausmachen kann?!)

Deshalb habe ich dann "EWX_POWEROFF or EWX_FORCE" ausprobiert, da dies ja den PC eigentlich auch ausschalten soll.... das Ergebnis war, dass der User ausgeloggt wird und man "sein Netzwerkkennwort" eingeben soll und der PC sich sofort wieder einloggt (es gibt nur einen User, mich, und dafür kein Kennwort...)

Ich versteh das einfach nicht! Auch ohne Kombination mit EWX_FORCE passiert genau das gleiche!

Was ist denn da los? Ich hab gar nix an dem Code verändert! Aber Windoof fährt einfach nicht mehr runter, so wie vorher

MfG Lefko
Johannes
-=[Nennst du meinen Namen, bin ich schon nicht mehr da]=-
  Mit Zitat antworten Zitat