Warm tip: This article is reproduced from serverfault.com, please click

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

(c# - Access denied on WaitForSingleObject on an event created from managed code)

发布于 2017-05-04 19:49:06

如何在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-在从托管代码创建的事件上,对WaitForSingleObject的访问被拒绝

Questioner
Jan
Viewed
0
2017-05-23 20:10:39

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

正如Hans Passant指出的那样-问题是OpenEvent调用的所需访问标志不完整。有问题的代码已经相应地固定并且可以正常工作。