Delphi XE8:外部コンソールアプリケーションの実行、結果の待機、および結果のキャプチャの問題

user3384674

WindowsのDelphiXE8で、外部コンソールアプリケーションを呼び出してその出力をキャプチャしようとしています。DOS(コマンド/コンソール)ウィンドウからの出力のキャプチャおよびシェル/ dosアプリからDelphiアプリへの出力の取得で説明されているように、次のコードを使用します

procedure TForm1.Button1Click(Sender: TObject) ;

  procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ;
  const
    ReadBuffer = 2400;
  var
    Security : TSecurityAttributes;
    ReadPipe,WritePipe : THandle;
    start : TStartUpInfo;
    ProcessInfo : TProcessInformation;
    Buffer : Pchar;
    BytesRead : DWord;
    Apprunning : DWord;
    S: String;
  begin
    With Security do begin
      nlength := SizeOf(TSecurityAttributes) ;
      binherithandle := true;
      lpsecuritydescriptor := nil;
    end;
    if Createpipe (ReadPipe, WritePipe,
                   @Security, 0) then 
    begin
      Buffer := AllocMem(ReadBuffer + 1) ;
      FillChar(Start,Sizeof(Start),#0) ;
      start.cb := SizeOf(start) ;
      start.hStdOutput := WritePipe;
      start.hStdInput := ReadPipe;
      start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
      start.wShowWindow := SW_HIDE;

      S:=UniqueString(DosApp);
      if CreateProcess(nil,
              PChar(S),
              @Security,
              @Security,
              true,
              NORMAL_PRIORITY_CLASS,
              nil,
              nil,
              start,
              ProcessInfo) then
      begin
        repeat
          Apprunning := WaitForSingleObject
                        (ProcessInfo.hProcess,100) ;
          Application.ProcessMessages;
        until (Apprunning <> WAIT_TIMEOUT) ;
        Repeat
          BytesRead := 0;
          ReadFile(ReadPipe,Buffer[0], ReadBuffer,BytesRead,nil) ;
          Buffer[BytesRead]:= #0;
          OemToAnsi(Buffer,Buffer) ;
          AMemo.Text := AMemo.text + String(Buffer) ;
        until (BytesRead < ReadBuffer) ;
      end;
      FreeMem(Buffer) ;
      CloseHandle(ProcessInfo.hProcess) ;
      CloseHandle(ProcessInfo.hThread) ;
      CloseHandle(ReadPipe) ;
      CloseHandle(WritePipe) ;
    end;
  end;

begin {button 1 code}
  RunDosInMemo('cmd.exe /c dir',Memo1) ; //<-- this works
  RunDosInMemo('"c:\consoleapp.exe" "/parameter"',Memo1) //<-- this hangs in the repeat until (Apprunning <> WAIT_TIMEOUT) ; 
end;

DOSコマンドでは機能しますが、コンソールアプリケーションでは機能しません。コンソールアプリケーションが起動して正しく実行されますが、repeat until (Apprunning <> WAIT_TIMEOUT)ループでハングします。問題を解決するために何を試みることができますか?

どうもありがとうございました!

user3384674

要約すると、DOSプログラムを実行して出力を取得する@DavidHeffernanのコードは動的に機能します。問題は、コンソールアプリケーションがUTF-16を出力することです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Delphi XE8は、アプリケーションの起動時にETetheringExceptionを適切に処理します

分類Dev

Delphi: OSX コンソール出力のキャプチャ

分類Dev

DelphiのTRegexを使用して、どのキャプチャグループが結果に一致したかを取得します

分類Dev

Delphiアプリケーションでのドラッグアンドドロップ操作の終了またはキャンセル

分類Dev

Delphiコンソールアプリケーションが入力文字数の制限を増やす

分類Dev

Delphi10.3を使用したコンソールアプリケーションでのTcomport

分類Dev

Delphiのラベルキャプションの変更が機能しない

分類Dev

Delphiはアプリケーションのシャットダウンを防ぎます

分類Dev

Delphiアプリケーションの実行中にメインフォームを変更する

分類Dev

Delphi XE8 FMX Android および USSD コード

分類Dev

Delphi XE-6 FiremonkeyデスクトップアプリケーションのデフォルトのFiremonkeyスタイルシート(ファイル)?

分類Dev

Delphi10.4のローカリゼーションの問題

分類Dev

Delphi XE8 idHttpErromessageのテキストコーディングが間違っています

分類Dev

Delphi ExcelOLEチャートデータラベルの問題

分類Dev

Delphi7のコンソールアプリケーションでランダムメソッドを使用できません

分類Dev

Delphi XE4iOSアプリケーションがコードサインの検証に失敗しました

分類Dev

Delphiの単一チャート上の積み上げおよび通常のバーシリーズ

分類Dev

Delphi XE2を使用してOracleBLOBをメモリにロードし、デフォルトのアプリケーションで開きます

分類Dev

タスクバー内のアプリケーションアイコンを変更する方法Delphi2010

分類Dev

他のDelphiバージョンと比較したXE8のSystem.Generics.Collectionsの違い

分類Dev

Delphi-デザイナーに複数行のキャプションを表示する

分類Dev

Delphiマルチデバイスアプリケーションのルーチンに遅延またはスリープを追加する

分類Dev

Delphi TFDTableSqLiteの問題

分類Dev

RDBMS 結果のキャッシュとアプリケーション レベルのキャッシュ?

分類Dev

スレッドはdelphiのコンソールアプリケーションで終了していませんか?

分類Dev

Delphi10.4およびXCode10.1でiOSアプリをコンパイルする際の問題-/ usr / bin / actoolが見つかりませんでした

分類Dev

FiremonkeyアプリケーションのカスタムListboxItemスタイル-Delphi10.1ベルリン

分類Dev

delphiアプリからlinuxコマンドラインユーティリティを実行し、出力をキャプチャします

分類Dev

Delphiアプリケーションが単純なC ++ DLL関数の呼び出しに失敗する

Related 関連記事

  1. 1

    Delphi XE8は、アプリケーションの起動時にETetheringExceptionを適切に処理します

  2. 2

    Delphi: OSX コンソール出力のキャプチャ

  3. 3

    DelphiのTRegexを使用して、どのキャプチャグループが結果に一致したかを取得します

  4. 4

    Delphiアプリケーションでのドラッグアンドドロップ操作の終了またはキャンセル

  5. 5

    Delphiコンソールアプリケーションが入力文字数の制限を増やす

  6. 6

    Delphi10.3を使用したコンソールアプリケーションでのTcomport

  7. 7

    Delphiのラベルキャプションの変更が機能しない

  8. 8

    Delphiはアプリケーションのシャットダウンを防ぎます

  9. 9

    Delphiアプリケーションの実行中にメインフォームを変更する

  10. 10

    Delphi XE8 FMX Android および USSD コード

  11. 11

    Delphi XE-6 FiremonkeyデスクトップアプリケーションのデフォルトのFiremonkeyスタイルシート(ファイル)?

  12. 12

    Delphi10.4のローカリゼーションの問題

  13. 13

    Delphi XE8 idHttpErromessageのテキストコーディングが間違っています

  14. 14

    Delphi ExcelOLEチャートデータラベルの問題

  15. 15

    Delphi7のコンソールアプリケーションでランダムメソッドを使用できません

  16. 16

    Delphi XE4iOSアプリケーションがコードサインの検証に失敗しました

  17. 17

    Delphiの単一チャート上の積み上げおよび通常のバーシリーズ

  18. 18

    Delphi XE2を使用してOracleBLOBをメモリにロードし、デフォルトのアプリケーションで開きます

  19. 19

    タスクバー内のアプリケーションアイコンを変更する方法Delphi2010

  20. 20

    他のDelphiバージョンと比較したXE8のSystem.Generics.Collectionsの違い

  21. 21

    Delphi-デザイナーに複数行のキャプションを表示する

  22. 22

    Delphiマルチデバイスアプリケーションのルーチンに遅延またはスリープを追加する

  23. 23

    Delphi TFDTableSqLiteの問題

  24. 24

    RDBMS 結果のキャッシュとアプリケーション レベルのキャッシュ?

  25. 25

    スレッドはdelphiのコンソールアプリケーションで終了していませんか?

  26. 26

    Delphi10.4およびXCode10.1でiOSアプリをコンパイルする際の問題-/ usr / bin / actoolが見つかりませんでした

  27. 27

    FiremonkeyアプリケーションのカスタムListboxItemスタイル-Delphi10.1ベルリン

  28. 28

    delphiアプリからlinuxコマンドラインユーティリティを実行し、出力をキャプチャします

  29. 29

    Delphiアプリケーションが単純なC ++ DLL関数の呼び出しに失敗する

ホットタグ

アーカイブ