TurboPackのDOSCommandコンポーネントは、DOSプログラム(.exe、.com、またはバッチファイル)を実行し、出力をメモやリストボックスにキャッチするコンポーネントです。プログラムの終了を待たずに出力を逐行で取得できるため、非常に便利です。DelphiおよびC++BuilderのWin32およびWin64環境で利用できます。このコンポーネントを使用することで、コマンドラインツールやバッチスファイルと連携するWindows対応のアプリケーションを簡単に開発することができます。
DOSCommandコンポーネント
DOSCommandコンポーネントは、以下のような機能を提供します。
- 外部コマンドの実行: 外部プログラムやコマンドを実行できます。
- 出力の取得: 標準出力および標準エラー出力を取得できます。
- 非同期実行: コマンドを非同期に実行し、アプリケーションのメインスレッドをブロックしないようにできます。
- イベントハンドリング: コマンドの出力が利用可能になったときや、コマンドが終了したときにイベントをトリガーします。
参考URLです。
インストール
DOSCommandコンポーネントは、GetItパッケージマネージャーからインストールできます。
GetItパッケージマネージャーを開き、「DOSCommand」と検索してTurboPack DOSCommandをインストールします。以下に、手順を説明します。
GetItパッケージマネージャーを選択する
C++BuilderのIDEのメインメニューから、「ツール」→「GetItパッケージマネージャー」をクリックします。
DOSCommandを検索する
「GetItパッケージマネージャー」のダイアログから、「DOSCommand」を検索し、「インストールボタン」をクリックしてインストールを実行します。(下の画像は、インストール済みなので、ボタンのキャプションは、「インストール済み」となっています。)
コンポーネントパレット
コンポーネントパレットに、「DOSCommand」というタブが追加され、DOSCommandコンポーネントが登録されます。
TDosCommandクラス
TDosCommandクラスの主な、メソッド、プロパティ、イベントは、以下の通りです。
メソッド
メソッド | 説明 |
---|---|
Execute | CommandLineに設定したコマンドを実行します。 |
SendLine | コマンド文字列を引数として渡して実行します。 |
Stop | コマンドの実行を途中で停止します。 |
プロパティ
型 | プロパティ | 説明 |
---|---|---|
System::UnicodeString | CommandLine | 実行するコマンドの文字列を設定します。 |
System::UnicodeString | CurrentDir | カレントディレクトリ(実行するディレクトリ)を設定します。 |
int | MaxTimeAfterBeginning | 実行後の最大の待ち時間を設定します。 |
SystemClassesTStringList* | Lines | |
SystemClassesTStrings* | OutputLines | 出力を渡すTstringsを設定します。 |
bool | IsRunning | コマンドを実行中かどうかを示すフラグ |
int | Priority | 実行のプライオリティを設定すします。(HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS) |
イベント
イベント | 説明 |
---|---|
OnTerminated | コマンドが終了したときに呼ばれます。 |
OnNewChar | 新しく出力された文字を取得できます。 |
OnNewLine | 出力された行を取得できます。 |
DOSCommandの基本的な使い方
GitHubに、DOSCommandコンポーネントのソースファイルが公開されています。
公開されている、ソースファイル「DosCommand.pas」の中にこ以下のようなこのコンポーネントの使用方法についての説明があります。
How to use it :
- just put the line of command in the property ‘CommandLine’
- execute the process with the method ‘Execute’
- if you want to stop the process before it has ended, use the method ‘Stop’
- if you want the process to stop by itself after XXX sec of activity,
use the property ‘MaxTimeAfterBeginning’- if you want the process to stop after XXX sec without an output,
use the property ‘MaxTimeAfterLastOutput’- to directly redirect outputs to a memo or a richedit, …
use the property ‘OutputLines’
(DosCommand1.OutputLines := Memo1.Lines;)- you can access all the outputs of the last command with the property ‘Lines’
- you can change the priority of the process with the property ‘Priority’
value of Priority must be in [HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS]- you can have an event for each New line and for the end of the process
with the events ‘procedure OnNewLine(Sender: TObject; NewLine: string;
OutputType: TOutputType);’ and ‘procedure OnTerminated(Sender: TObject);’- you can send inputs to the dos process with ‘SendLine(Value: string;
Eol: Boolean);’. Eol is here to determine if the program have to add a
CR/LF at the end of the string.
サンプルコード
SDIアプリケーションをベースに、DOSCommandコンポーネントを使用して、”ping google.com”コマンドを実行するサンプルアプリケーションです。
ここで紹介するサンプルプロジェクトは、以下からダウンロードできます。
DOSCommandサンプルプロジェクトです。
DOSCommandコンポーネントのヘッダファイル
GetItパッケージマネージャーを使用して、DOSCommandコンポーネントをインストールしても、ヘッダファイルのインストールはされないようです。
C++Builderで、DOSCommandコンポーネントを使用する為には、DOSCommandコンポーネントのヘッダファイルが必要です。GitHubで公開されている、DOSCommandコンポーネントのソースファイル中のDosCommand.pas をプロジェクトに追加してコンパイルすると、DosCommand.hpp が作成されます。このDosCommand.hpp をインクルードして使用します。
コマンドの実行
実行するコマンドの設定と、実行結果をTMemoに表示できるようにします。
- CommandLine
- 実行するコマンドを設定します。ここでは、”ping google.com”を設定しています。
- OutputLines
- 実行結果(標準出力)を表示するTStrings*を設定します。
__fastcall TSDIAppForm::TSDIAppForm(TComponent *AOwner)
: TForm(AOwner)
{
DosCommand1->CommandLine = "ping google.com";
DosCommand1->OutputLines = Memo1->Lines;
}
コマンドの実行
Execute()で、コマンドを実行します。IsRunningプロパティで、コマンドを実行中かどうかをチェックする事ができます。
void __fastcall TSDIAppForm::Ping1Click(TObject *Sender)
{
DosCommand1->Execute();
while(1)
{
Application->ProcessMessages();
if(!DosCommand1->IsRunning)
{
Memo1->Lines->Add("No Running!!");
break;
}
}
}
コマンドの終了イベント
OnTerminatedイベントを使って、コマンドの終了をチェックすることができます。
void __fastcall TSDIAppForm::DosCommand1Terminated(TObject *Sender)
{
Memo1->Lines->Add("End!!");
}
実行結果
実行結果です。
DOS窓での実行結果
DOS窓で、”ping google.com”コマンドを実行した結果です。DOSCommandで実行した結果と同じ実行結果と同じであることが確認できます。
DOSコマンドの実行
MS-DOSのコマンドは、そのまま指定してもエラーとなってなってしまいます。
”cmd.exe /c ”の引数としてコマンドを渡すことで実行できます。また、バッチファイルを作成して、そのバッチファイルを指定しても実行できます。
__fastcall TSDIAppForm::TSDIAppForm(TComponent *AOwner)
: TForm(AOwner)
{
DosCommand1->CommandLine = "cmd.exe /c dir";
DosCommand1->OutputLines = Memo1->Lines;
}