EXE-Datei aufrufen und warten bis fertig

Coalminer

Mitglied
Kennt jemand eine Möglichkeit eine exe-Datei aus C++ aufzurufen, und das aufrufende Programm solange warten zu lassen bis sie exe fertig abgearbeite ist ?

Irgendwie müsste es doch möglich sein irgendwie n Event abzufragen wenn ein Prozess "stirbt".
Hat irgendjemand sowas schon gemacht ?
 
moin


Wenn du dein Programm mit CreateProcess startest kannst du dir nen Handle auf den Process (also dein anderes Programm) geben lassen und mit diesem Handle dann überprüfen ob das Programm noch läuft.
Diese Überprüfung machst du dann in einer Schleife, die erst beendet wird wenn das andere Programm fertig ist.

Bevor du fragst wie man das macht schreib uns was für nen Compiler du benutzt.


mfg
umbrasaxum
 
Hier mal so ein Schnipsel, bitte die nicht mehr ganz sauberen Parameter zu verzeihen:

Code:
bool CWinUtils::StartAndWaitForProgram( const char* szCommandLine, DWORD* pExitCode, int iShowWindowFlags )
{

  STARTUPINFO             sui;

  PROCESS_INFORMATION     pi;


  memset( &sui, 0, sizeof( sui ) );
  sui.cb = sizeof( sui );
  sui.wShowWindow = iShowWindowFlags;

  std::string   strFileName = szCommandLine,
                strCmdLine = szCommandLine;

  if ( ( strFileName.length() )
  &&   ( strFileName[0] == '"' ) )
  {
    // der Pfad ist in Anführungszeichen gehalten
    strCmdLine = strFileName;
    strFileName = strFileName.substr( 1 );
    if ( strFileName.find( '"' ) != std::string::npos )
    {
      strFileName = strFileName.substr( 0, strFileName.find( '"' ) );
    }
  }
  else if ( strFileName.length() )
  {
    if ( strFileName.find( ' ' ) != std::string::npos )
    {
      strFileName = strFileName.substr( 0, strFileName.find( ' ' ) );
    }
  }

  std::string   strCurDir = strFileName.c_str();

  while ( ( strCurDir.length() )
  &&      ( strCurDir[strCurDir.length() - 1] != '\\' ) )
  {
    strCurDir = strCurDir.substr( 0, strCurDir.length() - 1 );
  }

  if ( strCurDir.length() )
  {
    strCurDir = strCurDir.substr( 0, strCurDir.length() - 1 );
  }

  if ( strCurDir.length() == 2 )
  {
    strCurDir += '\"';
  }

  char    szCmdLine[MAX_PATH];

  wsprintf( szCmdLine, strCmdLine.c_str() );

  if ( !CreateProcess( strFileName.c_str(),
                       szCmdLine,
                       NULL,
                       NULL,
                       FALSE,
                       CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP,
                       NULL,
                       strCurDir.c_str(),
                       &sui,
                       &pi ) )
  {
    return false;
  }

  MSG     msg;

  DWORD   dwExitCode = STILL_ACTIVE;

  do
  {
    Sleep( 20 );
    if ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
    {
      GetMessage( &msg, NULL, 0, 0 );
      if ( IsDialogMessage( ::GetParent( msg.hwnd ), &msg ) )
      {
        continue;
      }
      if ( msg.message == WM_ENDSESSION )
      {
        if ( (BOOL)msg.wParam )
        {
          // das aufgerufene Programm will Windows beenden
          // -> Loop beenden
          break;
        }
      }
      TranslateMessage( &msg );
      DispatchMessage( &msg );
    }
    GetExitCodeProcess( pi.hProcess, &dwExitCode );
  }
  while ( dwExitCode == STILL_ACTIVE );

  CloseHandle( pi.hThread );
  CloseHandle( pi.hProcess );

  if ( pExitCode != NULL )
  {
    *pExitCode = dwExitCode;
  }

  return true;

}
 
Super, funktioniert
hab mich ma durch den Code durchgearbeitet und hab versucht nachzuvollziehen wies funktioniert
allerding ist mir noch nich 100% klar was in der do-schleife alles passiert

theoretisch könnte man doch alles zwischen Sleep(20) und GetExitCode(...) rauswerfen wenn man sicher sagen kann das die exe die man auruft keinen shutdown von windows macht ?
seh ich das richtig ?
 
Die MessageLoop kannst du rausschmeissen, wenn du keinen Dialog im Hintergrund hast, der, während dein Programm wartet, normal reagieren soll.
Während dein Programm in der Schleife da ist, kommt die MessagePump ja nicht weiter; also keine Buttons drückbar, Dialoge verschiebbar, usw.
Theoretisch kannst du's einfach rausnehmen, probiers einfach mal.
 
Zurück