管理人のタツです。
最近、業務が少し忙しいのですが、
なぜかそういう時って本がよく読めるんですよね。
通勤・帰宅時ずっと本を読んでます。
題の通り、あるexeから別のexeを起動させます。
さっそく
プロジェクト作成
Visual Studioでプロジェクトを新規作成します。
プロジェクト名はPJ1、ソリューション名をTestにしておきます。
![](https://mathvoluntech.com/wp-content/uploads/2024/05/1-5-1024x682.png)
いつも通り、アプリケーションの種類はダイアログベースにして完了。
![](https://mathvoluntech.com/wp-content/uploads/2024/05/2-5-1024x650.png)
早い段階で、もう一つプロジェクトを作成しておきます。
ファイル→新規作成→プロジェクトを選択。
プロジェクト名は名前はPJ2です。
ソリューションは「ソリューションに追加」にします。
![](https://mathvoluntech.com/wp-content/uploads/2024/05/3-5-1024x682.png)
同じくダイアログベースで。
![](https://mathvoluntech.com/wp-content/uploads/2024/05/4-5-1024x650.png)
PJ2が作られました。
PJ2の処理
今回やることは、PJ1.exeを起動させたのち、
ボタンを押すとPJ2.exeが起動する、というやつです。
なので、PJ2側は処理を加える必要はありません。
ただ判別のため、中央に位置するスタティックテキストだけ変えておきます。
![](https://mathvoluntech.com/wp-content/uploads/2024/05/5-3-1024x650.png)
なんでもいいです、わかれば。
以上、PJ2の処理でした。
チャンチャン
PJ1の処理
PJ1の方も同様に、中央のテキストを変えておきます。
それともう一つ、ボタンを2つ追加しておきます。
![](https://mathvoluntech.com/wp-content/uploads/2024/05/6-2-1024x650.png)
片方のボタンを押すと、PJ2.exeを起動してもPJ1.exeは残りますが、
もう片方は切り替わりてきなかんじでPJ1.exeが閉じます。
まぁ難しい処理ではなく、1行追加するかどうかだけなんですけど。
ボタン2つをダブルクリックして、PJ1Dlg.cpp内に関数を自動作成します。
![](https://mathvoluntech.com/wp-content/uploads/2024/05/7-2-1024x596.png)
まず最初の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);
}
}
さて、ビルド
実行
![](https://mathvoluntech.com/wp-content/uploads/2024/05/8-2-1024x599.png)
PJ1.exeを起動させました。
これで左の「このダイアログは残る」ボタンを押すと
![](https://mathvoluntech.com/wp-content/uploads/2024/05/9-2-1024x607.png)
PJ2.exeが出てきました。
一度手前のダイアログを削除して、今度は右の「このダイアログは残らない」を押すと
![](https://mathvoluntech.com/wp-content/uploads/2024/05/10-2-1024x628.png)
PJ1.exeは消え、PJ2.exeが出てきます。
終わりに
今回は短いですがここまで。
単純にCreateProcessを使用したかっただけです。
業務で扱ってるソース、もう少しどういう場面で使われているか調べてみようかな…
コメント