ホーム
|
アプリケーション | Tips | ダウンロード | プログラム
| コラム

CBアプリ工房


Tips >   

CreateProcess で DOS 窓を表示 

更新 : 2010/08/01

 


解説:
CreateProcess 関数を使うとプログラムを引数付で実行することができます。実行開始後も、プログラムの終了を待つなどの制御が可能です。

ここでは、DOS 窓を表示して、ユーザーが終了するまで使用できるようにしてみます。

ちょっと寄り道:
CreateProcess 関数は以下のように定義されています。

BOOL CreateProcess(
    LPCTSTR lpApplicationName, // 実行ファイル名
    LPTSTR lpCommandLine, // コマンドラインパラメータ
    LPSECURITY_ATTRIBUTES lpProcessAttributes, // プロセスの保護属性
    LPSECURITY_ATTRIBUTES lpThreadAttributes, // スレッドの保護属性
    BOOL bInheritHandles, // オブジェクトハンドルの継承オプション
    DWORD dwCreationFlags, // 作成のフラグ
    LPVOID lpEnvironment, // 環境変数情報へのポインタ
    LPCTSTR lpCurrentDirectory, // カレントディレクトリの名前
    LPSTARTUPINFO lpStartupInfo, // ウィンドウ表示設定
    LPPROCESS_INFORMATION lpProcessInformation // プロセス・スレッド情報
);

使用例:
アプリケーション起動後、Button1 をクリックすると、DOS 窓が表示され、入力が可能になります。

ちょっと寄り道
MS-DOS 用バッチプログラムのコマンドは
以前、 COMMAND.COM が処理していました(別の実行ファイルを呼び出して処理する、外部コマンドもあり)。しかし、Windows XP などでは cmd.exe というコマンド行インタプリタが使われています(詳細はインターネットなどで調べてください)。

準備としては、Button をひとつ配置するだけです。

Button1 の OnClick イベントハンドラで、 起動情報を格納した STARTUPINFO 構造体と
起動プロセス情報を格納する PROCESS_INFORMATION 構造体を用意します。
それらを CreateProcess 関数の引数として記述します。
DOS 窓が自動的に閉じないように、CMD コマンドには /k オプションを指定しておきます(コマンドの詳細はインターネットなどで調べてください)。

最後に CloseHandle 関数でオブジェクトを解放しておわりです。

//-------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);

    PROCESS_INFORMATION pi;

    CreateProcess(NULL, "Cmd.exe /k", NULL, NULL,
                          false, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);

    // 不要になったので破棄
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);;
}
//-------------------------------------------------------------------



[ ホーム | ページトップ | ブック | リンク | サイトマップ ]
Copyright(c) 2003 Shibu All rights reserved.