Announcement

Collapse
No announcement yet.

Aufruf eines Kommandozeilenprogramms

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

  • Aufruf eines Kommandozeilenprogramms

    Hallo!

    Folgendes Problem. Ich möchte aus einem Delphi-Programm heraus ein Kommandozeilenprogramm starten und herausfinden wann das Programm seine Verarbeitung abgeschlossen hat.

    Derzeitig starte ich das Kommandozeilenprogramm mit WinExec(). Damit kann ich aber nicht feststellen, wann das Programm zu Ende ist.

    Grüsse
    Jan

  • #2
    Dazu kannst Du CreateProcess in Verbindung mit WaitForSingleObject verwenden. Um dafür zu sorgen, dass die Konsole nach dem Ausführen des Befehls wieder geschlossen wird, gibt man deim Aufruf des Befehlszeileninterpreters (kurz Shell) den Parameter /C zusätzlich an. Da die Shell auf den verschiedenen Windows-Versionen anders heisst (cmd.exe vs. command.com), sollte der Name aus der Umgebungsvariablen %ComSpec% ermittelt werden...

    <pre><p><b>function</b> ConsoleExec(<b>const</b> Command: <b>string</b>; <b>out</b> ExitCode: DWORD): Boolean;
    <b>var</b>
    CommandLine: <b>string</b>;
    StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
    <b>begin</b>
    Result := False;
    CommandLine := GetEnvironmentVariable('ComSpec') + ' /C ' + Command;
    FillChar(StartupInfo, SizeOf(StartupInfo), 0);
    StartupInfo.cb := SizeOf(TStartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := SW_SHOWDEFAULT;
    <b>if</b> CreateProcess(<b>nil</b>, PChar(CommandLine), <b>nil</b>, <b>nil</b>, False,
    CREATE_NEW_CONSOLE <b>or</b> CREATE_NEW_PROCESS_GROUP, <b>nil</b>, <b>nil</b>,
    StartupInfo, ProcessInfo) <b>then</b>
    <b>try</b>
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    Result := GetExitCodeProcess(ProcessInfo.hProcess, ExitCode);
    <b>finally</b>
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
    <b>end</b>;
    <b>end</b>;
    <p>
    <i>// Test</i>
    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>const</b>
    Command = 'dir C:\temp';
    <b>var</b>
    ExitCode: DWORD;
    <b>begin</b>
    <b>if</b> ConsoleExec(Command, ExitCode) <b>then</b>
    ShowMessage('Command executed, ExitCode: ' + IntToStr(ExitCode))
    <b>else</b>
    ShowMessage('Command failed, LastError: ' + SysErrorMessage(GetLastError));
    <b>end</b>;</p></pre&gt

    Comment


    • #3
      THANX!

      Insbesondere für den Quelltext !

      Gruss
      Jan Dere

      Comment

      Working...
      X