プロが教える店舗&オフィスのセキュリティ対策術

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

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によるイベントハンドル共有は、
イベントに名前をつけなくてはならない問題があり、利用しない方針です。

A 回答 (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関数を実行することでうまくいきました。
ありがとうございました。

補足日時:2010/11/09 12:49
    • good
    • 0
この回答へのお礼

別プロセスのプロセスハンドルを得るのに、
プロセスIDからOpenProcess関数を使い、
それからDuplicateHandle関数を実行することでうまくいきました。
ありがとうございました。

お礼日時:2010/11/09 12:48

ハンドルはポインターでアドレスを示すものなので、プロセスAのアドレスはプロセスBでは不当なアドレスになります。

    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2010/11/09 12:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!