[c/c++]Starten von Exe + überwachung?

  • Themenstarter Themenstarter Kyrara
  • Beginndatum Beginndatum
K

Kyrara

Hallo,

Ich hab damals ein Grund Leergang in C gehabt und wurd von einem freund gefragt ob ich ihn ne kleine hilfsprogramm schreiben könnte nur hab ich leider keine ahnung obs überhaupt geht.
So soll es ablaufen:
---------------------------------
1. erste.exe startet

2. zweite.exe startet

3. erste.exe schließt sich wenn zweite.exe geschlossen wird.

----------------------------------

Das problem ist:

1. keine ahnung wie ich eine Exe starten kann über C
2. Weiß ich nicht mal wie die Überwachung funktionieren soll.

Hab selbst schon ein paar sachen gelesen aber nirgends das passende gefunden.
Wäre sehr dankbar wenn jemand vielleicht schon nen fertiges Code hätte den ich benutzen oder abschauen könnte.

MfG Kyrara
 
Unter Windows würde das so gehen. Die GR-irgendwas sind Typedefs, sollten also problemlos ersetzbar sein. Hier direkt ein Code-Block aus meiner Codebasis, mit etwas Drumherum. Müsste sich aber einfach in C umsetzen lassen, die eigentlichen Funktionen der WinAPI sind ja C.

Code:
bool CWinUtils::StartAndWaitForProgram( const GR::tChar* szCommandLine, GR::u32* pExitCode, int iShowWindowFlags )
{

  STARTUPINFO             sui;

  PROCESS_INFORMATION     pi;


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

  GR::tString    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( ' ' ) );
    }
  }

  GR::tString   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 += '\\';
  }

  GR::tChar    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;

}
 
Zurück