Ich möchte aus einer C++ Builder-Anwendung ein anderes Programm starten
und dann auf die Beendigung desselben warten.
Mit der unten aufgeführten Methode funktioniert das auch, wenn eine Anwendung
aufgerufen wird, die ebenfalls mit dem Borland C++ Builder erstellt wurde.
Ich will aber eine Installation aufrufen, die mit dem InstallShield-Express erstellt wurde,
was leider nicht funktioniert:
Die Installation wird erst gestartet, wenn die aufrufende Anwendung abgebrochen wurde.
Es liegt jedenfalls an der Methode WaitForSingleObject.
<br>
//--- Source ------------------------------------------------------------------------<br>
bool __fastcall WinExecAndWait( const AnsiString & iAppPath, int iVisibility )<br>
{<br>
PROCESS_INFORMATION pi;<br>
STARTUPINFO si;<br>
<br>
memset( & pi, 0, sizeof( PROCESS_INFORMATION ) );<br>
memset( & si, 0, sizeof( STARTUPINFO ) );<br>
<br>
si.cb = sizeof( STARTUPINFO );<br>
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEONFEEDBACK;<br>
si.wShowWindow = iVisibility; // z.B. SW_SHOWNORMAL;<br>
<br>
if ( ! ::CreateProcess( NULL, iAppPath.c_str(),<br>
NULL,NULL,false,<br>
NORMAL_PRIORITY_CLASS, NULL, NULL, & si, & pi ) )<br>
{ // Error<br>
throw Exception( BTL::GetLastError() );<br>
}<br>
else // No Error<br>
{<br>
HANDLE proc = pi.hProcess;<br>
CloseHandle( pi.hThread );<br>
<br>
// Funktioniert für Borland-C++-Builder-Anwendungen aber nicht für Install-Shield-Anwendungen !!!<br>
bool result = ( WaitForSingleObject( proc, INFINITE ) != WAIT_FAILED );<br>
<br>
CloseHandle( proc );<br>
return result;<br>
}<br>
}<br>
und dann auf die Beendigung desselben warten.
Mit der unten aufgeführten Methode funktioniert das auch, wenn eine Anwendung
aufgerufen wird, die ebenfalls mit dem Borland C++ Builder erstellt wurde.
Ich will aber eine Installation aufrufen, die mit dem InstallShield-Express erstellt wurde,
was leider nicht funktioniert:
Die Installation wird erst gestartet, wenn die aufrufende Anwendung abgebrochen wurde.
Es liegt jedenfalls an der Methode WaitForSingleObject.
<br>
//--- Source ------------------------------------------------------------------------<br>
bool __fastcall WinExecAndWait( const AnsiString & iAppPath, int iVisibility )<br>
{<br>
PROCESS_INFORMATION pi;<br>
STARTUPINFO si;<br>
<br>
memset( & pi, 0, sizeof( PROCESS_INFORMATION ) );<br>
memset( & si, 0, sizeof( STARTUPINFO ) );<br>
<br>
si.cb = sizeof( STARTUPINFO );<br>
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEONFEEDBACK;<br>
si.wShowWindow = iVisibility; // z.B. SW_SHOWNORMAL;<br>
<br>
if ( ! ::CreateProcess( NULL, iAppPath.c_str(),<br>
NULL,NULL,false,<br>
NORMAL_PRIORITY_CLASS, NULL, NULL, & si, & pi ) )<br>
{ // Error<br>
throw Exception( BTL::GetLastError() );<br>
}<br>
else // No Error<br>
{<br>
HANDLE proc = pi.hProcess;<br>
CloseHandle( pi.hThread );<br>
<br>
// Funktioniert für Borland-C++-Builder-Anwendungen aber nicht für Install-Shield-Anwendungen !!!<br>
bool result = ( WaitForSingleObject( proc, INFINITE ) != WAIT_FAILED );<br>
<br>
CloseHandle( proc );<br>
return result;<br>
}<br>
}<br>
Comment