对于从托管代码创建的事件,WaitForSingleObject上的访问被拒绝

时间:2017-05-04 19:49:06

标签: c# c++ multithreading synchronization ipc

如何在C#中创建一个命名事件对象,以便我可以在单独的C ++过程中等待它?

我简化的流程A的C#代码:

EventWaitHandle evt = new EventWaitHandle(false, EventResetMode.AutoReset, "eventName");
EventWaitHandle.SignalAndWait(evt , <other event>);

进程B的简化C ++代码:

HANDLE hEvt = OpenEvent(
    EVENT_MODIFY_STATE | SYNCHRONIZE,  // access
    FALSE,               // do not inherit handle
    TEXT("eventName")
);

if (hEvt == NULL)
{
    printf("CreateEvent failed (%d)\n", GetLastError());
    //error out
}

DWORD dwWaitResult = WaitForSingleObject(hEvt, INFINITE); 
switch (dwWaitResult)
{
    case WAIT_OBJECT_0:
        //Signalled  - all good
        break;

    // An error occurred
    default:
        printf("Wait error (%d)\n", GetLastError());
        //error out
}

当我运行(或调试)此代码时,创建事件(C#)并打开(C ++)就好了。但是,我在WaitForSingleObject期间收到错误5(拒绝访问)。 添加'Global \'前缀没有帮助(也没有在C#代码中添加EventWaitHandleSecurity参数,允许完全控制所有内置用户)。

我做错了什么?这应该可以吗?

编辑通过添加SYNCHRONIZE所需的访问权限来修复C ++。值得注意的是Hans Passant - Access denied on WaitForSingleObject on an event created from managed code

1 个答案:

答案 0 :(得分:1)

(回答自己,因为没有其他答案可以接受,但不再是没有答案的问题了。)

As pointed out by Hans Passant - 问题出现在OpenEvent调用的不完整的期望访问标志中。 相关代码已经相应修复并正常工作。