Autor |
Beitrag |
Bronstein
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: Di 19.02.08 09:22
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; |
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: 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; |
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: 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())); |
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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, genau wie zu den weiteren möglichen Parametern.
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.
|
|
|