C++ Builder Snippets  

Anwendung mit CreateProcess starten, auf Abschluß der Initialisierung warten, auf Programmende warten, Rückgabewert ermitteln:

Beim Beispielprojekt handelt es sich um eine Anwendung, die mit Hilfe der API-Funktion CreateProcess() den Windows-Editor startet, wartet bis das Programm bereit ist die Benutzereingaben entgegenzunehmen (die Initialisierungsdauer wird im entsprechenden Label auf dem Formular angezeigt), wartet anschliessend auf das Programmende und zeigt die gesamte Programmlaufzeit sowie den Rückgabewert (ExitCode) der Anwendung an. Die Zeiten werden mit Hilfe der Funktion GetTickCount() ermittelt. Die Kernfunktionalität der Anwendung wird im folgenden Code-Snippet erläutert (den gesamten Projekt-Quellcode können Sie am Ende dieser Seite als ZIP-Datei downloaden): Screenshot
//---------------------------------------------------------------------------
// Klick-Eventhandler für die "Notepad starten"-Schaltfläche
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnRunClick(TObject *Sender)
{
  TStartupInfo stgStartupInfo;         // für CreateProcess()
  TProcessInformation stgProcessInfo;

  DWORD ExitCode;                       // für den ExitCode

  setmem(&stgStartupInfo,sizeof(TStartupInfo),0);
  stgStartupInfo.cb = sizeof(TStartupInfo);

  // Notepad starten:
  if(CreateProcess(NULL,"c:\\windows\\notepad.exe c:\\autoexec.bat",
                NULL,NULL,false,
                CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS,
                NULL,NULL,
                &stgStartupInfo,&stgProcessInfo)==TRUE)
  {
    CloseHandle(stgProcessInfo.hThread);  // wird nicht mehr gebraucht..

    // Auf das Ende der Initialisierung der soeben gestarteten
    // Anwendung warten (Initialisierung ist beendet wenn das Programm
    // bereit ist, die Benutzereingaben entgegenzunehmen)
    WaitForInputIdle(stgProcessInfo.hProcess, INFINITE);
    
    // nun ist die Initialisierung des Notepads abgeschlossen !


    // Auf das Programmende warten (es würde auch ohne Schleife
    // mit WaitForSingleObject(stgProcessInfo.hProcess, INFINITE)
    // funktionieren, allerdings würden die Systembotschaften
    // von der Anwendung nicht verarbeitet, das Fenster nicht
    // aktualisiert etc. Daher warten wir "in Scheibchen" a 0,1s und
    // rufen immer wieder ProcessMessages auf. Gleiche Vorgehensweise
    // wäre bei grösseren Anwendungen auch bei WaitForInputIdle()
    // angebracht, beim Notepad lohnt es sich aufgrund der kurzen
    // Initialisierungsdauer allerdings nicht. :)
    while(WaitForSingleObject(stgProcessInfo.hProcess, 100) == WAIT_TIMEOUT)
    {
      Application->ProcessMessages(); // Nachrichtenwarteschlage verarbeiten
    }

    // Das Programm wurde beendet...

    // Rückgabewert auslesen:
    GetExitCodeProcess(stgProcessInfo.hProcess, &ExitCode);

    // die Variable ExitCode ist nun mit dem Rückgabewert unserer Anwendung 
    // (Notepad) initialisiert

    CloseHandle(stgProcessInfo.hProcess); // Ressourcen freigeben
  }
}

  Download BCB4
Projekt-Quellcode
Download
Demo-Exe

© '99-2000 by S. Kreutzmann