Entwickler-Ecke
Windows API - gestartetes Programm mit shellexecute wieder beenden
Bronstein - Di 19.02.08 09:22
Titel: gestartetes Programm mit shellexecute wieder beenden
Hallo, ich starte ein Programm mit Shellexecute und möchte dieses wieder beenden. Jetzt habe ich folgendes versucht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button1Click(Sender: TObject); var Test_Prog: HWND; begin Test_Prog := ShellExecute(Test_Prog,'open',PChar('CommandManager.exe'),nil,PChar(ExtractFilePath('c:\asys\CommandManager.exe')),SC_DEFAULT); sleep(5000); SendMessage(Test_Prog,WM_SYSCOMMAND,SC_CLOSE,0); end; |
Delete - Di 19.02.08 10:02
Du solltest dich mal darüber informieren, was
ShellExecute für einen Wert zurückliefert. Das ist nämlich kein Fensterhandle, sondern ein Fehlercode. Entweder du suchst dir mit
FINDWINDOW das Fensterhandle oder du benutzt [msdn]Createprocess[msdn] oder
SHELLEXECUTEEX und beendest das Programm mittels der ProzessID, die dir diese Funktionen zurückliefern.
Bronstein - Di 19.02.08 11:29
Mit CreateProcess bekomme ich es aber nicht hin das Programm zu starten:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| function RunProcess(FileName: string): Longword; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin FillChar(StartupInfo, SizeOf(StartupInfo), #0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; StartupInfo.wShowWindow := SW_SHOW; if not CreateProcess(nil, @Filename[1], nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then Result := WAIT_FAILED; end;
procedure TForm1.Button2Click(Sender: TObject); begin RunProcess('c:\asys\CommandManager.exe'); end; |
Delete - Di 19.02.08 11:45
Bronstein hat folgendes geschrieben: |
| Mit CreateProcess bekomme ich es aber nicht hin das Programm zu starten: |
Und warum nicht? Bist du den Code mal in Einzelschritten durchgegangen? Was sagt GetLastError? ...? ...? ...?
Beim mir funktioniert der Code übrigens tadellos, bis auf die Warnmeldung, dass der Rückgabewert von
RunProcess undefiniert sein könnte. Das sollte man noch ändern. Warum gibst du überhaupt
WAIT_FAILED zurück, wenn
CreateProcess fehlschlägt?
So sieht das ganze sauber aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function RunProcess(FileName: string): Boolean; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin FillChar(StartupInfo, SizeOf(StartupInfo), #0); FillChar(ProcessInfo, SizeOf(ProcessInfo), #0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; StartupInfo.wShowWindow := SW_SHOW; result := CreateProcess(nil, @Filename[1], nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo); end;
procedure TForm1.Button1Click(Sender: TObject); begin if not RunProcess('c:\Windows\Notepad.exe') then ShowMessage(SysErrorMessage(GetLastError)); end; |
Bronstein - Di 19.02.08 11:54
Hallo, es kommt folgende Meldung wenn ich GetLastError: Der Vorgang wurde erfolgreich beendet.
Das Programm sehe ich aber nicht wie in meiner obigen Funktion, mit Shellexecute.
Delphi-Quelltext
1:
| ShowMessage(SysErrorMessage(GetLastError())); |
Delete - Di 19.02.08 12:45
Da es mit Notepad geht, muss es mit dem Programm zusammenhängen. Was ist denn das für ein Programm? Und guck dir hier "CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS" mal die möglichen Parameter an.
jaenicke - Di 19.02.08 14:57
Wobei Notepad ja kein Kommandozeilenprogramm ist, das Programm, um das es hier geht, aber ja schon. (Das sieht man ja am Parameter CREATE_NEW_CONSOLE, der dafür sorgt, dass ein Kommandozeilenprogramm eine neue Konsole bekommt statt die des Elternprozesses zu benutzen.)
Mehr zu dem Parameter gibts
bei MS [
http://msdn2.microsoft.com/en-us/library/ms682528.aspx], genau wie zu den
weiteren möglichen Parametern [
http://msdn2.microsoft.com/en-us/library/ms684863.aspx].
Sollte es sich doch um ein fensterbasiertes Programm handeln, dann vermute ich, dass einfach nur eine neue Konsole erzeugt wird statt das Programm tatsächlich anzuzeigen, denn das ist mit diesem Parameter ebenfalls möglich.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!