異なるプロセス間でのイベントハンドルの共有
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によるイベントハンドル共有は、
イベントに名前をつけなくてはならない問題があり、利用しない方針です。
No.1
- 回答日時:
ハンドルはポインターでアドレスを示すものなので、プロセスAのアドレスはプロセスBでは不当なアドレスになります。
No.2ベストアンサー
- 回答日時:
作成元のプロセスおよび、作成したハンドルに対して
適切なアクセス権を与えていますか?
特にPROCESS_DUP_HANDLEは、NT/2000以降では必須です。
また、関数に指定するハンドルが間違っているような気がします。
第1引数は”プロセスのハンドル”であり、第4引数は”複製する対象のハンドル”です。
提示されたソースではどちらが正しいのかわかりませんが、
もう一度、MSDNを確認し関数仕様を確認された方が良いように思います。
>&RealProcessHandle, // 本物のハンドル
>RealProcessHandle, // プロセスAが(1)で取得した本物のハンドル
なお、異なるプロセス間では、名前付き以外で共有する場合、
共有メモリや名前付きパイプなどを使用しなければならないパターンもあり
端から名前付きイベントを作成した方が安全な場合もあるので、
本当に名前付きイベントではダメなのか、再考するほうが良いかも知れません。
参考URL:http://msdn.microsoft.com/en-us/library/ms724251 …
この回答への補足
別プロセスのプロセスハンドルを得るのに、
プロセスIDからOpenProcess関数を使い、
それからDuplicateHandle関数を実行することでうまくいきました。
ありがとうございました。
別プロセスのプロセスハンドルを得るのに、
プロセスIDからOpenProcess関数を使い、
それからDuplicateHandle関数を実行することでうまくいきました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- 国産車 軽自動車のメーカーとハンドル操作感について、お聞きします。 ハンドルを切る時に、ハンドルが軽いのは、 4 2022/11/19 08:46
- バイク車検・修理・メンテナンス 新車バイクでシミー現象? 5 2022/04/27 23:18
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- 輸入車 左ハンドルや並行輸入車を買う人 11 2022/12/24 15:29
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- 運転免許・教習所 細い民家なんかで車を走らせ左折してすぐ左折する時巻き込み見る前に少し左折の用意でハンドルを回し気味で 5 2023/07/04 20:20
- 車検・修理・メンテナンス 4G63ってなんで左ハンドル側搭載でインターミディエイトギヤ入れてたんですか? 1 2023/03/29 14:00
- その他(車) 車のハンドルにハンドルロックを着けると、ハンドルに傷が付くので、タオルを巻いても傷が付きます。 車の 5 2022/05/10 17:17
- 車検・修理・メンテナンス ハンドルを切った際の音について。 4 2023/08/13 23:29
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
起動中の他のプログラム(orプ...
-
プロセスのアタッチ・デタッチ...
-
シェルで親プロセス終了時に子...
-
完全な乱数を生成する方法
-
ウインドウのプロセス終了について
-
怪しいプロセス教えてください。
-
タスクマネージャーのプロセス...
-
起動中のEXCELファイル(EXCEL...
-
バックグラウンドのプロセスの...
-
ウィンドウのタイトルからプロ...
-
CreateObjectで作成したExcelの...
-
VB6.0 SHELLで起動...
-
CPUの使用率について
-
GPLによるソース公開の回避方法
-
他のアプリケーションの操作に...
-
UNIX関数?(popen)...
-
この中で間違ってある説明はあ...
-
起動中のプロセスのメモリを書...
-
今のCPUは2nmプロセスとか何や...
-
IMEを再起動したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
C#でのbatファイル実行結果取得
-
プロセスのアタッチ・デタッチ...
-
VB6.0 SHELLで起動...
-
プロセスIDからウィンドウハ...
-
Process.Startの戻り値を後で取得
-
ウィンドウのタイトルからプロ...
-
他のEXEが起動しているかの確認
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
別のプロセスの関数を呼び出す...
-
C++のプログラムをバックグラウ...
-
Linuxでのスレッド間メッセージ...
-
C++でシェルを起動
-
プロセスIDの取得方法について
-
OSPFでプロセスを分ける意義に...
-
非表示になったエクセルは?
-
Windowsでのfork方法
おすすめ情報