Einzelnen Beitrag anzeigen

xweghau

Registriert seit: 29. Dez 2008
Ort: Soest
11 Beiträge
 
Delphi 7 Professional
 
#1

?Shellexecute? aus Windows Dienst

  Alt 5. Jan 2009, 09:50
Hallo!

Ich möchte einen Windows Dienst schreiben, in dem ich überprüfe, ob ein bestimmtes Programm läuft. Wenn das Programm nicht läuft, soll es gestartet werden. Die Überprüfung funktioniert und ich kann das Programm auch mit ShellExecute starten. Leider wird das externe Programm aber als Benutzer "System" ausgeführt mit dem "kleinen" Schönheitsfehler, dass es unsichtbar bleibt, obwohl ich als ShowCmd-Parameter "SW_Show" angegeben habe. Das Programm wird mit dem Benutzer "System" gestartet.

Hat jemand eine Ahnung, was ich da evtl. falsch mache?

Nachfolgend der Delphi 7 Prof. Quellcode:
Delphi-Quellcode:
procedure TsvcArchivprgUeberwachung.Timer1Timer(Sender: TObject);
var hProcess: THandle;
    iRet: Integer;
    sPfad: String;
begin
// Beispiel: sPfad := 'c:\Programme\Archiv\Archiv.EXE';
// Beispiel: sTaskname := 'Archiv.EXE';
// Feststellen, ob die Anwendung läuft
  hProcess := GetProcessHandleFromID(GetProcessID(sTaskname));
  if hProcess = 0 then begin
    iRet := ShellExecute(0, 'open', PChar(sPfad), nil, nil, SW_SHOW);
    if iRet < 33 then begin
{Start eines externen Programmes, das eine Fehlermail erzeugt (das hat aus dem Dienst heraus nicht geklappt, daran muss ich noch mal dran arbeiten, aber so läuft es)}
      iRet := ShellExecute(0, 'open', PChar(ExtractFilePath(ParamStr(0)) + '\MailFromArchive.exe'), PChar('Hinweis:'), PChar(''), SW_HIDE );
{Ich überprüfe nicht, ob mein Versuch eine Mail zu erzeugen erfolgreich war (was habe ich davon, es teilt mir ja keiner mit :-))
Falls notwendig: Verlängerung des Prüfintervalls auf eine Stunde, damit nicht zu viele Mails erzeugt werden.}

      If iInterval < 3600000 then Timer1.Interval := 3600000;
    end;
    end
  else
    Timer1.Interval := iInterval;
end;
Danke schon mal fürs Lesen. Ich hoffe, es fehlen keine Infos.

Gruß
Franz
  Mit Zitat antworten Zitat