• ベストアンサー

プロセスのハンドルを確保

AプログラムからBプログラムを起動するプログラムを作成しています。 AはループでBプログラムを起動するのですが、Aでプロセスの起動数をチェックし、飽きのプロセスハンドルを確保しBプログラム意を起動する際にAで確保したハンドルを使用して起動するような処理をするにはどうしたらいいでしょうか? 例:プロセス最大起動数:5   Aは10回ループし、Bを起動する。   Aでプロセスハンドルを5個確保する。   Bを起動する際に確保したハンドルを1個使用する。   Bが終了したらハンドルを解放する。   

質問者が選んだベストアンサー

  • ベストアンサー
noname#50176
noname#50176
回答No.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)

noname#50176
noname#50176
回答No.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; } 参考として。

upstartdec
質問者

補足

ありがとうございます。 プロセス終了後にハンドル初期化する際はどうしたらいいでしょうか? ハンドルをリストであつかったほうがいいですかね? 配列だと固定になってしまうので。

関連するQ&A

  • プロセスハンドル or ウインドウハンドル ??

    こんにちは、E46-M3と申します。 さっそくですが、 あるプログラムから別のアプリケーションを起動させる際 または、終了させる際「ハンドル」を使用しますが、 ハンドルそのものの知識が浅いので 是非わかりやすく教えて頂ければ思います。 また、プロセスハンドルとウインドウハンドルの 違いについても教えて頂ければと思います。 よろしくお願い致します。

  • 異なるプロセス間でのイベントハンドルの共有

    異なるプロセス間でのイベントハンドルの共有 WIN32 APIのDuplicateHandleを用いて、異なるプロセス間でのイベントハンドルを共有したいのですが、うまく動作しません。(1)~(3)にプログラムの詳細を示します。 (1) プロセスAで「本物」のプロセスハンドルを取得   DuplicateHandle(     GetCurrentProcess(),         GetCurrentProcess(),    // 疑似ハンドル     GetCurrentProcess(),     &RealProcessHandle,     // 本物のハンドル     0,     FALSE,     DUPLICATE_SAME_ACCESS   ); (2) プロセスAでイベントを作成   hEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); (3) プロセスBでイベントハンドルを複製   DuplicateHandle(     RealProcessHandle,     // プロセスAが(1)で取得した本物のハンドル     hEvent,           // プロセスAが(2)で取得したイベントハンドル     GetCurrentProcess(),     &hNewEvent,         // プロセスBで利用するためのイベントハンドル     0,     FALSE,     DUPLICATE_SAME_ACCESS   ); 上記のプログラムを実行すると、(1)と(2)は成功するものの、(3)の時点でエラーになり、 GetLastErrorでは6(ハンドルの異常)が表示されます。 プログラムのどこが悪いのでしょうか? 尚、OpenEventによるイベントハンドル共有は、 イベントに名前をつけなくてはならない問題があり、利用しない方針です。

  • プロセス監視

    VisualBasic6.0でWindows2000上で動くプロセス監視プログラムを開発しています。 監視対象a.exe(仮)を起動させた際に取得したPIDを元に起動状態の監視を行っているのですが、ひとつ気がかりとなっていることがあります。 a.exe(仮)エラー停止直後に、他のプロセスb.exeが起動した際に、a.exe(仮)に割り振られていたPIDがb.exeのプロセスに割り当てられ、プロセス監視プログラムがa.exe(仮)の停止を検知できないという可能性はないでしょうか? WindowsでPID割当ての仕組みにお詳しい方、教えてください。 宜しくお願いします。 尚、a.exe(仮)は起動引数付でマルチ起動させるためプロセス名で起動状態を監視することは出来ません。

  • fork()で作られた子プロセスから親プロセスの生存を知る方法は?

    タイトルの通りなのですが、プロセスAから fork()で子プロセスBを作り、Bには無限ループで処理をさせます。 Aはユーザからの入力を受け、処理を行います。 Aが終了要求をされプロセスを終了するときに、 Bも同時に終了したいのですが、BからAの生存を判定して Aのプロセスが切れていたBも終了する、ということは可能でしょうか? Bの無限ループ処理では、ファイルの書き換えを行っているので AからBのPIDを指定してKillする、ということはせずに B自身で判定して終了するようにしたいのですが。。

  • エクスプローラから開かれるWordを別プロセスにするには

    VC++2008にてプログラムを作成しています。 自作プログラム(疑似エクスプローラ)にて、 WordやExcelファイルをCreateProcessにて オープンし、WaitForSingleObjectにて ファイルが閉じられるまで待機。 ファイルが閉じられたら、終了処理という流れのシステムを 作成しています。 自作プログラムからオープンする際は、 Officeのコマンドラインオプションを用いて 別プロセスで起動するようにしていますので、 自作プログラムからWord(またはExcel)ファイルを 複数開いても、個別プロセスになるので、 各ファイルが個別に終了処理を行えるようになっています。 (なっていると思っていた) 問題は、自作プログラムからWord(a.doc)を開き、 エクスプローラから別ファイルのWord(b.doc)を開いた際、 b.docは個別にプロセスが作成されず、 a.docで作成した1プロセスにまとめられてしまうことです。 そのため、a.docを閉じても、b.docが開いている限り、 終了処理に移行しません。 APIフックにて、CreateProcessを引っ掛けてみたのですが、 エクスプローラからのファイルオープン時には 呼ばれていないようで、自作プログラム外で ファイルオープンをした際に、強制的に独自プロセスで 起動する方法が分りません。 自作プログラム起動時に限り、Word,Excelのファイルを 独自プロセスで開かせたいのですが、 解決方法はありますでしょうか? よろしくお願いします。

  • 起動可能なプロセス数について

    こんにちは。 だれか教えてください。 winndowsNT、2000で200個のプロセスを起動させたい のですが90個あまりで起動できなくなってしまいます。 winndowsNT、2000の最大起動可能プロセス数は いくつぐらいなのでしょうか? また、設定により個数を増やすことは可能なの でしょうか? なにか知っている人がいましたら教えてください。 お願いします。

  • プロセス数を減らしたい

    あるプログラムのパッチを当てようとしているのですが、途中で 「プロセス数が多すぎます。」 とエラーになり、失敗します。 不要なプロセスを殺そうと思って、マシンを再起動後ps -feで確認したところ vx_inactive_thread というプロセスが50個も立ちあがっていました。 このプロセスは何なんでしょうか?少なくするにはどうすればいいでしょうか?

  • processという名のプログラム

    パソコンにプレインストールされているファイアーウオールソフトのPCGATEpersonalを使用していますが、そのProgramの中にいつも"process" という名の、使用している憶えのないプログラムが表示されます。パソコンを起動する度に"process928"とか"process956"とか番号が変わります。また、プログラムの詳細を表示する"Prpgram settings"という表示にはこのprocessは表示されていません。 もしかして、このprocessというのは何か変なプログラムなのでしょうか?

  • 別のプロセスの関数を呼び出す方法はありますか?

    別のプロセスの関数を呼び出す方法はありますか? WINDOWSでプロセスAとプロセスBがあり、 プロセスBの関数ポインタをプロセスAで取得するところまではできるのですが、 この後、プロセスAからプロセスBの関数をコールバックする方法はありますか? アドレス空間はプロセスごとに固有であるため、 通常のコールバックではうまくいかないと思うのですが・・・。 尚、プロセスAとプロセスBは、異なるプログラムです。

  • Access2000のプロセスが残る

    Access2000のプロセスが残る こんにちわ、いつもお世話になってます。 実行環境:WindowsXP Pro、Access2000、アプリ1(VB.NET作成) 開発環境:Windows7、Access2007、VB2008、アプリ1(VB.NET作成) VB.NET作成アプリはSQLサーバに情報を登録し 登録された情報をもとに印刷用テーブルを作成し Accessのマクロを起動させるプログラムです。 AccessはリンクテーブルでSQLサーバと接続され、 印刷用のレポートがあり、マクロはレポートを起動するものです。 プログラムは以下のような記述をしています。 ============================================ Dim oAcs As Access.Application oAcs = New Access.Application oAcs.OpenCurrentDatabase("C:\Print.mdb") oAcs.DoCmd.SetWarnings(False) oAcs.DoCmd.RunCommand(10) ' ウィンドウの最大化 oAcs.DoCmd.OpenForm("印刷") '印刷マクロ起動 oAcs.DoCmd.Maximize() ' 画面の最大化 oAcs.Visible = True AppActivate("Microsoft Access") oAcs.DoCmd.RunCommand(10) ' ウィンドウの最大化 ============================================ レポート表示後の印刷は自動ではないため Accessを起動したら起動しっぱなしになってます。 解放処理をしていないのでプロセスが残るのは既知です。 開発環境にてアプリ1を実行させAccessでレポートを表示させます。 Accessを終了してもプロセスが残りますがアプリ1を終了させると Accessのプロセスは終了します。 実行環境にて上記の同様の動作を行うと アプリ1を終了させてもプロセスが残ってしまう場合があります。 VB.NETで作成された同様のアプリからのAccess起動にも関わらず プロセスが残ってしまうのはAccessのバージョンとかが関係してるんでしょうか? 情報提供をお待ちしてます。