Rückgabewert eines externen Programmaufrufes auffangen

Pitchblack

Mitglied
Guten Morgen Community!

Ich suche nach einem Code mit dem man ein externes Programm aufrufen (also z.B. mit system(),WinExec() oder CreateProcess()) und den Rückgabewert auffangen kann. Ich rufe ein Programm names sizeof.exe auf. Dieses Programm ermitteln die Größe einer Datei in Errorleveln auf DOS Ebene. Diese Errorlevelzahl möchte in einem C++ Programm einbinden.
Hat jemand eine Idee?
 
Da musst du über CreateProcess gehen und laufend prüfen, ob das Programm beendet ist (in die Schleife UNBEDINGT ein Sleep einbinden und evtl. eine Windows MessagePump).

Die Funktion zum Prüfen des Exit Codes (auch errorlevel) heisst GetExitCodeProcess. Wenn das Programm noch läuft, kommt FALSE zurück und GetLastError gibt STILL_ACTIVE zurück.
 
Ist es denn möglich mehrere Prozesse in einer CreateProcess Anweisung zu starten? So könnte ich mir den Weg ersparen die Errorlevel in C++ einzubinden und direkt mit ihnen arbeiten.
 
Du kannst mit CreateProcess direkt nur einen Prozess kontrollieren. Du kannst aber durchaus mehrere Aufrufe von CreateProcess machen. Du musst dann halt auch alle Handles abprüfen.

Und nicht vergessen, die Handles nach Beenden mit CloseHandle freizugeben.
 
Da musst du über CreateProcess gehen und laufend prüfen, ob das Programm beendet ist (in die Schleife UNBEDINGT ein Sleep einbinden und evtl. eine Windows MessagePump).
Die Funktion zum Prüfen des Exit Codes (auch errorlevel) heisst GetExitCodeProcess. Wenn das Programm noch läuft, kommt FALSE zurück und GetLastError gibt STILL_ACTIVE zurück.

Kannst du mir da ein kleines Beispiel zeigen? Ich blick da ehrlich gesagt nicht durch.
 
Nutz doch mal die Suchfunktion! Ich habe erst vor wenigen Tagen ein komplettes Beispiel hier eingestellt.
 
Probier mal das:

Code:
bool CWinUtils::StartAndWaitForProgram( const char* szCommandLine, GR::u32* 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;

}

Sollte eigentlich wirklich grossteils selbsterklärend sein.
 
Zurück