AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi ExitWindowEx funktioniert einfach nicht mehr....
Thema durchsuchen
Ansicht
Themen-Optionen

ExitWindowEx funktioniert einfach nicht mehr....

Ein Thema von Lefko · begonnen am 15. Feb 2004 · letzter Beitrag vom 19. Feb 2004
Antwort Antwort
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
Lefko

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

Re: ExitWindowEx funktioniert einfach nicht mehr....

  Alt 19. Feb 2004, 14:55
Hm, wundersamerweise funktioniert er wieder....

Ich nehme jetzt immer nur EWX_SHUTDOWN und damit geht es....

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


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 10:35 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