MFCで別のダイアログを起動させる

管理人のタツです。

最近、業務が少し忙しいのですが、
なぜかそういう時って本がよく読めるんですよね。

通勤・帰宅時ずっと本を読んでます。

題の通り、あるexeから別のexeを起動させます。

さっそく

プロジェクト作成

Visual Studioでプロジェクトを新規作成します。

プロジェクト名はPJ1、ソリューション名をTestにしておきます。

いつも通り、アプリケーションの種類はダイアログベースにして完了。

完成!

早い段階で、もう一つプロジェクトを作成しておきます。

ファイル→新規作成→プロジェクトを選択。

プロジェクト名は名前はPJ2です。

ソリューションは「ソリューションに追加」にします。

同じくダイアログベースで。

PJ2が作られました。

PJ2の処理

今回やることは、PJ1.exeを起動させたのち、
ボタンを押すとPJ2.exeが起動する、というやつです。

なので、PJ2側は処理を加える必要はありません。

ただ判別のため、中央に位置するスタティックテキストだけ変えておきます。

なんでもいいです、わかれば。

以上、PJ2の処理でした。
チャンチャン

PJ1の処理

PJ1の方も同様に、中央のテキストを変えておきます。

それともう一つ、ボタンを2つ追加しておきます。

片方のボタンを押すと、PJ2.exeを起動してもPJ1.exeは残りますが、
もう片方は切り替わりてきなかんじでPJ1.exeが閉じます。

まぁ難しい処理ではなく、1行追加するかどうかだけなんですけど。

ボタン2つをダブルクリックして、PJ1Dlg.cpp内に関数を自動作成します。

まず最初のOnBnClickedButton1内に、以下を記述します。

void CPJ1Dlg::OnBnClickedButton1()
{
	// TODO: ここにコントロール通知ハンドラー コードを追加します。
	//ダイアログが残る方

	// PJ2を起動させる
	STARTUPINFO si;
	PROCESS_INFORMATION pi;

	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);
	ZeroMemory(&pi, sizeof(pi));

	// PJ2.exeパス
	CString strExePath = _T("C:\\Users\\tatsu\\source\\repos\\Test\\x64\\Debug\\PJ2.exe");

	// プロセスを作成
	if (CreateProcess(strExePath, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
	{
		// プロセスが作成されたので、ハンドルを閉じます
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);

		// 現在のダイアログを閉じない
		//OnOK();
	}
	else
	{
		// プロセスの作成に失敗した場合のエラーメッセージ
		MessageBox(_T("PJ2.exeの起動に失敗しました。"), _T("エラー"), MB_OK | MB_ICONERROR);
	}
}

STARTUPINFO構造体とPROCESS_INFORMATION構造体は、
CreateProcessを使用して新しいプロセス作成するときに使われる構造体、
Zeromemoryは構造体初期化用
…だったはず!だいぶ前に学習したときの記憶!

これで左のボタンを押すとPJ2.exeが出てきます。
ただし、PJ1.exeは閉じません。

閉じるためには25行目のコメントを外します。

void CPJ1Dlg::OnBnClickedButton2()
{
	// TODO: ここにコントロール通知ハンドラー コードを追加します。
	//ダイアログが残らない方

	// PJ2を起動させる
	STARTUPINFO si;
	PROCESS_INFORMATION pi;

	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);
	ZeroMemory(&pi, sizeof(pi));

	// PJ2.exeパス
	CString strExePath = _T("C:\\Users\\tatsu\\source\\repos\\Test\\x64\\Debug\\PJ2.exe");

	// プロセスを作成
	if (CreateProcess(strExePath, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
	{
		// プロセスが作成されたので、ハンドルを閉じます
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);

		// 現在のダイアログを閉じる
		OnOK();
	}
	else
	{
		// プロセスの作成に失敗した場合のエラーメッセージ
		MessageBox(_T("PJ2.exeの起動に失敗しました。"), _T("エラー"), MB_OK | MB_ICONERROR);
	}
}

さて、ビルド

実行

PJ1.exeを起動させました。

これで左の「このダイアログは残る」ボタンを押すと

PJ2.exeが出てきました。

一度手前のダイアログを削除して、今度は右の「このダイアログは残らない」を押すと

PJ1.exeは消え、PJ2.exeが出てきます。

終わりに

今回は短いですがここまで。

単純にCreateProcessを使用したかっただけです。

業務で扱ってるソース、もう少しどういう場面で使われているか調べてみようかな…

コメント

タイトルとURLをコピーしました