Announcement

Collapse
No announcement yet.

Returncode von einem Prg das aufgerufen wurde

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Returncode von einem Prg das aufgerufen wurde

    Hallo

    ich möchte ein externes Prg mit Parametern aufrufen. Dieses Prg
    verarbeitet Daten an Hand der übergebenen Paramter. Das klappt
    auch alles wunderbar. Nach der Verabeitung gibt das aufgerufene
    Prg einen Returncode zurück. Wie kann ich den abfangen und verarbeiten.

  • #2
    Hallo,

    die Win32-API-Funktion <b>GetExitCodeProcess</b> ist für diese Aufgabe zuständig. Das folgende Beispiel demonstriert den Einsatz anhand des Betriebssystemprogramms netstat.exe. Am Ende steht der Returncode in der Variable <i>dwExit</i> zur Verfügung:
    <pre>
    procedure TForm1.ToolButton1Click(Sender: TObject);
    var
    aSA : TSecurityAttributes;
    aSI : TStartupInfo;
    aPI : TProcessInformation;
    szTemp : array[0..199] of Char;
    FName : String;
    hLogFile : THandle;
    dwExit : DWORD;
    begin
    FillChar(aSA, SizeOf(aSA), #0);
    aSA.nLength := SizeOf(aSA);
    aSA.bInheritHandle := True;
    // temp. Dateinamen für Output generieren
    FillChar(szTemp, SizeOf(szTemp), #0);
    GetEnvironmentVariable(PCHar('TEMP'), szTemp, 180);
    FName := szTemp + '\netstat.txt';
    // Output-Datei öffnen
    hLogFile := CreateFile(PCHar(FName), GENERIC_WRITE or GENERIC_READ,
    FILE_SHARE_READ or FILE_SHARE_WRITE,
    @aSA, CREATE_ALWAYS, 0, 0);
    // Standard-Output in Datei umleiten
    GetStartupInfo(aSI);
    aSI.dwflags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
    aSI.wShowWindow := SW_HIDE;
    aSI.hStdOutput := hLogFile;
    aSI.hStdError := hLogFile;
    if CreateProcess(nil,PChar('netstat'), nil, nil, True,
    NORMAL_PRIORITY_CLASS,
    nil, nil, aSI, aPI) then
    begin
    repeat
    Application.ProcessMessages;
    GetExitCodeProcess(aPI.hProcess, dwExit)
    until dwExit <> STILL_ACTIVE;
    CloseHandle(aPI.hThread);
    CloseHandle(aPI.hProcess);
    CloseHandle(hLogFile);
    end
    else
    Abort;
    Memo1.Lines.LoadFromFile(FName);
    DeleteFile(FName);
    // irgendwas mit dwExit machen...
    end;
    </pre&gt

    Comment


    • #3
      Danke für die schnelle Hilfe

      hat alles prima geklapp

      Comment

      Working...
      X