【名前】 プロセスコミュニケートコンポーネント(適当w) 【バージョン】 0.0.1 【公開日】 2007/04/06 【作者】 BabelII 【開発環境】 Windows98SE + Delphi6Personal 【使用条件】 何があっても自己責任で… このコンポーネントを含んだアプリに不具合が発生しても作者は一切責任を負いませんっ! 【ホームページ】 http://babelii.s19.xrea.com/soft/ 【メールアドレス】 babelii2001@yahoo.co.jp 【転載】 基本的に不可、原則として不可(バグバグだろうから( つД`) ) 【改変】 良識の範囲内でおねがいします。(改変後の再配布については一切関知しません) ◎これは何? DOSプログラム(最近はコンソールアプリというの?)を動かして入出力を行うためのコンポーネントです。 ◎インストール方法 えーっと、よく分かんないけど、普通のコンポーネントと同じでいいんじゃないかな? ◎アンインストール方法 知りません。 ◎使用方法 いわゆる非ビジュアルコンポーネントです。適当なフォームを用意して乗っけてください。 CommandLineで指定した実行ファイルを子プロセスとして動かします。コマンドラインオプションを含めることも可能ですが、別にOptionプロパティを用意しているのでこれを用いることもできます。 標準出力(StdOut)エラー出力(ErrOut)の読み出しには二つの方法があります。 一つ目は、OnGet***Outイベントです。第一引数にプロセスID、第二引数に読み出したテキスト(string)が入っています。受け取ったテキストに対して処理を行うにはこちらの方法がいいのではないでしょうか? 二つ目は、読み出し用TStringsを用いる方法です。SetOutPutStringsの第一引数が標準出力、第二引数がエラー出力に対応します。単純に出力をモニターするだけなら、TMemo.Linesとかに結びつけてやればいいだけなので、こちらの方法がいいのではないでしょうか? 標準入力(StdIn)への書き込みには、SendCommandを用います。子プロセスが実行中であれば内部バッファ(TStringList)に文字列をため込みます。これは出力の待ち受けループの中で標準出力に書き出されます。 子プロセスを実行するには、StartProcessを呼んでください。子プロセスが終了した場合には、OnExitイベントが発生します。子プロセスを強制終了させるには、KillProcessを呼んでください。ただし、この方法は予測不可能な結果をもたらすおそれが大きいのでおすすめできません。 詳しくは同梱のCommProcessDemoMain.pasとかを見て…も分かりにくいかもしれない( つД`) ◎既知の問題 ・子プロセス実行中に終了した場合には確実に不具合が生じます。アプリ終了前にプロセスを強制終了すれば回避できるかもしれませんが分かりません。 ・XPを含めNT系列のOSではテストしていませんし、想定もしていません。正しく動くかもしれませんが動かないかもしれません。(Vista?何それ?どこの新車?) ・同梱のstdio.exeですが、サンプルとして使用するには若干難があります。おそらくDelphiの仕様だと思いますが、標準出力がバッファリングされているようです。そのため、ある程度出力がたまらないと出てこないようです。工夫する余地はあるのでしょうが、どう考えても本筋ではない(つーかめんどくさい)ので、この部分は仕様とします。 ・command.comを実行ファイルに指定した場合にKillProcessを呼ぶと、redir32.exeとwinoa386.modが終了しないまま残ってしまいます。exitコマンドを送って正常終了した場合には問題ないようですので、command.comを使う場合は注意してください。 ・ほとんどテストしていないので、想定外の操作を行った場合は、何が起こるか知りませんガクガク (((゚д゚;))) ブルブル ・コピペから作った部分も多いので、すごく無駄なソースになっていると思いますが、気にしないでください。 ・デモプログラムでFastMMを利用しているのですが、これをコメントアウトすると、エラーがでる場合があります。原因がさっぱりわからないので放置してます。 ◎主なファイル readme.txt このファイル Appendix.txt 補足情報 CommProcessPG.bpg コンポーネント、デモプログラム、コンソールアプリのプロジェクトを CommProcessPG.dsk ひとまとめにしたプロジェクトグループ CommProcessDemo.dof デモプログラム関係 CommProcessDemo.dpr CommProcessDemoMain.pas CommProcessDemoMain.dcu CommProcessDemoMain.dfm CommProcessDemo.cfg CommProcessDemo.res CommProcessDemo.exe stdio.dof サンプルコンソールアプリ関係 stdio.dpr stdio.cfg stdio.exe CommProcess.dcu コンポーネント関係 CommProcess.dof CommProcess.bpg CommProcess.cfg CommProcess.res CommProcess.pas CommProcess.dcr CommProcessLib.dof CommProcessLib.dpk CommProcessLib.cfg CommProcessLib.res CommProcessLib.dcu …うん、そうなんだ。自分でも何が何のためのファイルかよく分かってないんだ(´・ω・`) ◎その他 バグ報告は歓迎しますが、改善は作者の力量的に見て無理だと思ってください。 ◎謝辞 以下のページを参考にさせて頂きました。ありがとうございました。 [Delphi] GUI アプリからコンソールアプリを実行するには - Autch.net http://www.autch.net/tips/delphi_anonymous_pipe.php Nifty FDelpi サンプル蔵 "スレッドでプロセスを起動する" http://forum.nifty.com/fdelphi/samples/01507.html http://forum.nifty.com/fdelphi/samples/01508.html http://forum.nifty.com/fdelphi/samples/01510.html (2007/04/06現在見れなくなっている模様(´・ω・`)ショボーン) BlueLeaf1336-PROBLEMS-2004_0013 http://www.geocities.jp/fjtkt/problems/2004_0013.html Creating a Child Process with Redirected Input and Output http://msdn2.microsoft.com/ja-jp/library/ms682499(en-us).aspx コンソール プロセスを生成して標準ハンドルをリダイレクトする方法 http://support.microsoft.com/kb/190351/ja Redirecting an arbitrary Console's Input/Output - The Code Project - Threads, Processes & IPC http://www.codeproject.com/threads/redir.asp SourceForge.jp: Project Info - OpenGoban http://sourceforge.jp/projects/opengoban/ 通信対戦について http://www.computer-go.jp/gifu2005/regulations/communication.html くだすれDelphi(超初心者用)その40 http://pc11.2ch.net/test/read.cgi/tech/1172844367/ デモプログラム内でFastMMを利用しています。 http://sourceforge.net/projects/fastmm/ 導入については次のページによりました。 FastMMの導入 http://homepage2.nifty.com/Mr_XRAY/Delphi/CompoInstall/UsageFastMM.htm ◎バージョン履歴 0.0.1 本邦初公開版(2007/04/06)