Hallo,<br><br>ich möchte ein anderes Programm starten und solange warten, bis das dieses andere Programm beendet wurde.<br>Sollte der Benutzer sich dazu entscheiden, dass der ganze Vorgang vorzeitig beendet wird, dann möchte ich die andere Anwendung beenden, dies gelingt mir irgendwie nicht.<br>Der Funktion wird innerhalb von TTestThread.Execute aufgerufen.<br>
<PRE>
function StartenTest(sParam : string): Integer;
var
aSI : TStartupInfo;
aPI : TProcessInformation;
aProc : THandle;
dwTest: DWORD;
pc1, pc2: PChar;
ErrCode, i : integer;
HS : string;
begin
Result := -1;
FillChar(aSI, SizeOf(aSI), 0);
aSI.cb := SizeOf(aSI);
aSI.lpTitle := PChar('');
aSI.wShowWindow := sw_ShowNormal;
pc1 := nil;
pc2 := PChar(fProgPath + 'Project1.exe ' + sParam); // fProgPath -> ExtractFilePath(Application.ExeName)
if CreateProcess( pc1, pc2, nil, nil, False, NORMAL_PRIORITY_CLASS,
nil, nil, aSI, aPI) then
begin
aProc := aPI.hProcess;
CloseHandle(aPI.hThread);
repeat
dwTest := WaitForSingleObject(aProc, 1000);
if (dwTest <> Wait_Failed) and (dwTest <> Wait_TimeOut) then
begin
GetExitCodeProcess(aProc, dwtest);
Result := dwTest;
end;
if not Terminated then Sleep(200);
until Terminated or (dwTest <> Wait_TimeOut);
if Terminated then
begin
<b>// Thread.Terminate wurde aufgerufen und jetzt möchte ich das Programm, welches ich gestartet habe beenden</b>
end;
CloseHandle(aProc);
end
// else
// Result := GetLastError;
end; { function StartenTest }
</PRE>
Vieleicht hat jemand einen Vorschlag.<br><br>Danke im vorhinein Stephan Hartmann<br><br>PS: Falls die Anwendung korrekt ausgeführt wurde, dann benötige ich den ExitCode.
<PRE>
function StartenTest(sParam : string): Integer;
var
aSI : TStartupInfo;
aPI : TProcessInformation;
aProc : THandle;
dwTest: DWORD;
pc1, pc2: PChar;
ErrCode, i : integer;
HS : string;
begin
Result := -1;
FillChar(aSI, SizeOf(aSI), 0);
aSI.cb := SizeOf(aSI);
aSI.lpTitle := PChar('');
aSI.wShowWindow := sw_ShowNormal;
pc1 := nil;
pc2 := PChar(fProgPath + 'Project1.exe ' + sParam); // fProgPath -> ExtractFilePath(Application.ExeName)
if CreateProcess( pc1, pc2, nil, nil, False, NORMAL_PRIORITY_CLASS,
nil, nil, aSI, aPI) then
begin
aProc := aPI.hProcess;
CloseHandle(aPI.hThread);
repeat
dwTest := WaitForSingleObject(aProc, 1000);
if (dwTest <> Wait_Failed) and (dwTest <> Wait_TimeOut) then
begin
GetExitCodeProcess(aProc, dwtest);
Result := dwTest;
end;
if not Terminated then Sleep(200);
until Terminated or (dwTest <> Wait_TimeOut);
if Terminated then
begin
<b>// Thread.Terminate wurde aufgerufen und jetzt möchte ich das Programm, welches ich gestartet habe beenden</b>
end;
CloseHandle(aProc);
end
// else
// Result := GetLastError;
end; { function StartenTest }
</PRE>
Vieleicht hat jemand einen Vorschlag.<br><br>Danke im vorhinein Stephan Hartmann<br><br>PS: Falls die Anwendung korrekt ausgeführt wurde, dann benötige ich den ExitCode.
Comment