Einzelnen Beitrag anzeigen

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