1

いくつかのイベントハンドルがあり、それらをリストに追加します。これらのハンドルを保存し、ローカルのハンドルを閉じて、保存したハンドルを後で使用できるかどうかを知りたいです。

例:

std::map<std::string, HANDLE> Events;

DWORD OpenSingleEvent(std::string EventName, bool InheritHandle, DWORD dwDesiredAccess, DWORD dwMilliseconds)
{
    Handle hEvent = OpenEvent(dwDesiredAccess, InheritHandle, EventName.c_str()); //Local Handle.
    if (hEvent)
    {
        DeleteSingleEvent(EventName); //Delete the correct/old handle in the map.
        Events.insert(EventName, hEvent);  //Add this new handle to the map.
        DWORD Result = WaitForSingleObject(hEvent, dwMilliseconds);
        CloseHandle(hEvent);  //Close THIS handle. Not the one in my Map.
        return Result;
    }
    CloseHandle(hEvent);  //Close this handle.
    return WAIT_FAILED;
}

上記は機能しますか?そうでない場合、これを行う別の方法はありますか?これは共有メモリ通信用であり、サーバーではなくクライアントPIDしかないため、ハンドルを複製できません。

また、誰かがInheritHandleの機能を説明できますか?私が使用している関数はOpenEventであり、そのパラメーターがありますが、それが何をするのかわかりません。

4

1 に答える 1

2

AHANDLEは単なるavoid *であり、カーネル空間のオブジェクトを実際に表すトークンです。呼び出すCloseHandleと、実際にはカーネルオブジェクトの割り当てが解除されるため、質問に対する簡単な答えは「いいえ」です。それらのリストを保持してから、すべてのローカルオブジェクトを閉じることはできません。あなたが持っているのは、void*何も表していないリストだけです。

あなたができることはDuplicateHandle、あなたに代わって実際に別のカーネルオブジェクトを作成する使用です。ただし、リストのエントリが終了したら、ハンドルを閉じてみませんか?

于 2012-10-18T15:23:29.480 に答える