Autor Beitrag
Bronstein
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Di 19.02.08 09:22 
Hallo, ich starte ein Programm mit Shellexecute und möchte dieses wieder beenden. Jetzt habe ich folgendes versucht:
ausblenden 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);
  //ShellExecute(Test_Prog,'close',PChar('CommandManager.exe'),nil,PChar(ExtractFilePath('c:\asys\CommandManager.exe')),SC_DEFAULT);
  //PostMessage(Test_Prog,WM_Close,0,0);
  //CloseHandle(Test_Prog);
  SendMessage(Test_Prog,WM_SYSCOMMAND,SC_CLOSE,0); // Schließen
end;

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Suche im MSDN FINDWINDOW das Fensterhandle oder du benutzt [msdn]Createprocess[msdn] oder Suche im MSDN SHELLEXECUTEEX und beendest das Programm mittels der ProzessID, die dir diese Funktionen zurückliefern.
Bronstein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: Di 19.02.08 11:29 
Mit CreateProcess bekomme ich es aber nicht hin das Programm zu starten:
ausblenden 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



BeitragVerfasst: Di 19.02.08 11:45 
user profile iconBronstein 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:
ausblenden 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], nilnil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nilnil,
    StartupInfo, ProcessInfo);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not RunProcess('c:\Windows\Notepad.exe'then
    ShowMessage(SysErrorMessage(GetLastError));
end;
Bronstein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: 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.

ausblenden Delphi-Quelltext
1:
ShowMessage(SysErrorMessage(GetLastError()));					

_________________
Es gibt keine dummen Fragen nur dumme Antworten!!!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.