|
|
||||
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);; } //------------------------------------------------------------------- |