AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Batchdatei mit ShellExecute nach Standby bzw. Ruhezustand?
Thema durchsuchen
Ansicht
Themen-Optionen

Batchdatei mit ShellExecute nach Standby bzw. Ruhezustand?

Ein Thema von BlackGuest · begonnen am 30. Jan 2009 · letzter Beitrag vom 31. Jan 2009
 
BlackGuest

Registriert seit: 30. Jan 2009
52 Beiträge
 
Delphi XE7 Professional
 
#1

Batchdatei mit ShellExecute nach Standby bzw. Ruhezustand?

  Alt 30. Jan 2009, 21:09
Ich möchte mir ein kleines Programm schreiben, was mir nach dem Erwachen aus dem Standby bzw. Ruhezustand eine Batchdatei ausführt.

So weit bin ich bisher gekommen:

Delphi-Quellcode:
procedure TMainForm.WMPowerBroadcast(var Msg: TMessage);
 var Befehl: array[0..500] of char;
    oldpath,path,temp: String;
const
  PBT_APMQUERYSUSPEND = $0000;
  PBT_APMBATTERYLOW = $0009;
  PBT_APMQUERYSTANDBY = $0001;
  PBT_APMQUERYSUSPENDFAILED = $0002;
  PBT_APMQUERYSTANDBYFAILED = $0003;
  PBT_APMSUSPEND = $0004;
  PBT_APMSTANDBY = $0005;
  PBT_APMRESUMECRITICAL = $0006;
  PBT_APMRESUMESUSPEND = $0007;
  PBT_APMRESUMESTANDBY = $0008;
  PBTF_APMRESUMEFROMFAILURE = $00000001;
  PBT_APMPOWERSTATUSCHANGE = $000A;
  PBT_APMOEMEVENT = $000B;
begin
  case Msg.wParam of
    PBT_APMSTANDBY:
     begin
      if (StandByPrg<>'')and(Fileexists(StandByPrg)) then
       begin
  // MessageDlg('Go to Standby Mode', mtInformation,[mbOk], 0);
        oldPath:=GetCurrentDir;path:=extractFilePath(StandByPrg); chDir(path);
        temp:=extractFileName(StandByPrg); StrPCopy(Befehl,temp);
        ShellExecute(Handle,nil,befehl,'',nil,1);
        ChDir(oldPath);
       end;
     end;
    PBT_APMSUSPEND:
     begin
      if (SuspendPrg<>'')and(Fileexists(SuspendPrg)) then
       begin
 // MessageDlg('Go to Suspend Mode', mtInformation,[mbOk], 0);
        oldPath:=GetCurrentDir;path:=extractFilePath(SuspendPrg); chDir(path);
        temp:=extractFileName(SuspendPrg); StrPCopy(Befehl,temp);
        ShellExecute(Handle,nil,befehl,'',nil,1);
        ChDir(oldPath);
       end;
     end;
    PBT_APMRESUMESUSPEND:
     begin
      if (WUfromSuspendPrg<>'')and(Fileexists(WUfromSuspendPrg)) then
       begin
  // MessageDlg('Resume from Suspend Mode', mtInformation,[mbOk], 0);
        oldPath:=GetCurrentDir;path:=extractFilePath(WUfromSuspendPrg); chDir(path);
        temp:=extractFileName(WUfromSuspendPrg); StrPCopy(Befehl,temp);
        ShellExecute(Handle,nil,befehl,'',nil,1);
        ChDir(oldPath);
       end;
     end;
    PBT_APMRESUMESTANDBY:
     begin
      if (WUfromStandByPrg<>'')and(Fileexists(WUfromStandByPrg)) then
       begin
  // MessageDlg('Resume from Standby Mode', mtInformation,[mbOk], 0);
        oldPath:=GetCurrentDir;path:=extractFilePath(WUfromStandByPrg); chDir(path);
        temp:=extractFileName(WUfromStandByPrg); StrPCopy(Befehl,temp);
        ShellExecute(Handle,nil,befehl,'',nil,1);
        ChDir(oldPath);
       end;
     end;
  end;
end;
Der Vollständigkeit halber habe ich die Standby und Suspend Messages auch gleich mit eingebaut.
Das Programm soll also in den Pfad der Datei wechseln, die Datei ausführen und dann den alten Pfad wieder herstellen. Funktioniert aus diesem Zusammenhang genommen für sich auch so wie erwünscht. Nur nach dem Erwachen in Zusammenhang mit dem obigen Code nicht.
Ich habe teilweise unterschiedliche Fehlermeldungen bekommen. Einmal "application-defined exception (code 0xC0000006)" an nicht bestimmbarer Stelle und einmal "EInOutError 'E/A Fehler 1231' beim Ausführen von ShellExecute.

Füge ich eine Pause ein oder lass den auskommentierten MessageDlg drin, funktioniert es.
Woran könnte das Problem liegen? Muss ich irgendwie warten, bis das Windows (XP Professional) wieder komplett hochgefahren ist?

Zweites Problem, egal ob ich den Rechner in den Standby oder in den Ruhezustand schicke, beim Erwachen hat Msg.wParam den Wert PBT_APMRESUMESUSPEND. Da stimmt doch auch irgend etwas nicht.

Falls noch irgendwas zum Code oder zum System fehlt bitte melden.

Gruß
BlackGuest

[Edit]
Der Fehler "application-defined exception (code 0xC0000006)" tritt beim Erwachen aus dem Ruhezustand auf. So wie es aussieht bevor Shellexecute ausgeführt wird. "EInOutError 'E/A Fehler 1231" kommt beim Erwachen aus dem Standby bei der ausführung von Shellexecute.
  Mit Zitat antworten Zitat
 


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 20:39 Uhr.
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