- ベストアンサー
プロセスのハンドルを確保
AプログラムからBプログラムを起動するプログラムを作成しています。 AはループでBプログラムを起動するのですが、Aでプロセスの起動数をチェックし、飽きのプロセスハンドルを確保しBプログラム意を起動する際にAで確保したハンドルを使用して起動するような処理をするにはどうしたらいいでしょうか? 例:プロセス最大起動数:5 Aは10回ループし、Bを起動する。 Aでプロセスハンドルを5個確保する。 Bを起動する際に確保したハンドルを1個使用する。 Bが終了したらハンドルを解放する。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>プロセス終了後にハンドル初期化する際はどうしたらいいでしょう >か? 以下に変更します。 #include <windows.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR nCmdLine, int lCmdShow) { PROCESS_INFORMATION pr; STARTUPINFOA st; char buf[50]; HANDLE hProcess[5]={0,0,0,0,0}; HWND hWnd[5]={0,0,0,0,0}; memset(&st,0,sizeof(st)); st.cb=sizeof(st); for (int j,i=1;i<=10;i++) { wsprintf(buf,"%d 回目",i); switch (MessageBox(0,"処理を選択して下さい\r\rOK:起動\rキャンセル:次のループ",buf,MB_ICONINFORMATION|MB_OKCANCEL)) { case IDOK: for (j=0;j<5;j++) if (!IsWindow(hWnd[j])) { CloseHandle(hProcess[j]); hWnd[j]=0,hProcess[j]=0; } for (j=0;j<5;j++) if (!hWnd[j]) break; if (j==5) continue; CreateProcess("c:\\windows\\notepad.exe",0,0,0,0,CREATE_NEW_PROCESS_GROUP,0,0,&st,&pr); Sleep(1000);//低速CPUでも信頼できるウエイト hWnd[j]=GetForegroundWindow(); hProcess[j]=pr.hProcess; i=--i&0xf; continue; case IDCANCEL: continue; } } return 0; }
その他の回答 (1)
非同期に監視するのであれば、 たしかに同期オブジェクトは使えませんね。 自プロセスが作成した他プロセスですからそのプロセスが 終了してもインスタンスの実体が残るため終了を検出できません。 (これはハンドル開放を自プロセスが担うためです) これを実現するにはシステムフックが必要ですが、 フックを使用しない簡単な方法を載せます。 #include <windows.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR nCmdLine, int lCmdShow) { PROCESS_INFORMATION pr; STARTUPINFOA st; char buf[50]; HWND hWnd[5]={0,0,0,0,0}; memset(&st,0,sizeof(st)); st.cb=sizeof(st); for (int j,i=1;i<=10;i++) { wsprintf(buf,"%d 回目",i); switch (MessageBox(0,"処理を選択して下さい\r\rOK:起動\rキャンセル:次のループ",buf,MB_ICONINFORMATION|MB_OKCANCEL)) { case IDOK: for (j=0;j<5;j++) if (!IsWindow(hWnd[j])) hWnd[j]=0; for (j=0;j<5;j++) if (!hWnd[j]) break; if (j==5) continue; CreateProcess("c:\\windows\\notepad.exe",0,0,0,0,CREATE_NEW_PROCESS_GROUP,0,0,&st,&pr); Sleep(1000);//低速CPUでも信頼できるウエイト hWnd[j]=GetForegroundWindow(); i=--i&0xf; continue; case IDCANCEL: continue; } } return 0; } 参考として。
補足
ありがとうございます。 プロセス終了後にハンドル初期化する際はどうしたらいいでしょうか? ハンドルをリストであつかったほうがいいですかね? 配列だと固定になってしまうので。