2024/06/03 電子書籍「電子書籍出版・技術文書作成を劇的に加速!秀丸エディタ + Markdown + Pandocの驚異」を出版

DOSCommandコンポーネントの使い方

C++Builder

TurboPackのDOSCommandコンポーネントは、DOSプログラム(.exe、.com、またはバッチファイル)を実行し、出力をメモやリストボックスにキャッチするコンポーネントです。プログラムの終了を待たずに出力を逐行で取得できるため、非常に便利です。DelphiおよびC++BuilderのWin32およびWin64環境で利用できます。このコンポーネントを使用することで、コマンドラインツールやバッチスファイルと連携するWindows対応のアプリケーションを簡単に開発することができます。

DOSCommandコンポーネント

DOSCommandコンポーネントは、以下のような機能を提供します。

  1. 外部コマンドの実行: 外部プログラムやコマンドを実行できます。
  2. 出力の取得: 標準出力および標準エラー出力を取得できます。
  3. 非同期実行: コマンドを非同期に実行し、アプリケーションのメインスレッドをブロックしないようにできます。
  4. イベントハンドリング: コマンドの出力が利用可能になったときや、コマンドが終了したときにイベントをトリガーします。

参考URLです。

インストール

DOSCommandコンポーネントは、GetItパッケージマネージャーからインストールできます。

GetItパッケージマネージャーを開き、「DOSCommand」と検索してTurboPack DOSCommandをインストールします。以下に、手順を説明します。

GetItパッケージマネージャーを選択する

C++BuilderのIDEのメインメニューから、「ツール」→「GetItパッケージマネージャー」をクリックします。

DOSCommandを検索する

「GetItパッケージマネージャー」のダイアログから、「DOSCommand」を検索し、「インストールボタン」をクリックしてインストールを実行します。(下の画像は、インストール済みなので、ボタンのキャプションは、「インストール済み」となっています。)

コンポーネントパレット

コンポーネントパレットに、「DOSCommand」というタブが追加され、DOSCommandコンポーネントが登録されます。

TDosCommandクラス

TDosCommandクラスの主な、メソッド、プロパティ、イベントは、以下の通りです。

メソッド

メソッド説明
ExecuteCommandLineに設定したコマンドを実行します。
SendLineコマンド文字列を引数として渡して実行します。
Stopコマンドの実行を途中で停止します。

プロパティ

プロパティ説明
System::UnicodeStringCommandLine実行するコマンドの文字列を設定します。
System::UnicodeStringCurrentDirカレントディレクトリ(実行するディレクトリ)を設定します。
intMaxTimeAfterBeginning実行後の最大の待ち時間を設定します。
SystemClassesTStringList*Lines
SystemClassesTStrings*OutputLines出力を渡すTstringsを設定します。
boolIsRunningコマンドを実行中かどうかを示すフラグ
intPriority実行のプライオリティを設定すします。(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サンプルプロジェクトです。

公開:2024年6月22日

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;
}
タイトルとURLをコピーしました