对从托管代码创建的事件的 WaitForSingleObject 访问被拒绝
Access denied on WaitForSingleObject on an event created from managed code
如何在 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 -
(回答我自己,因为没有其他答案可以接受,但这不再是未回答的问题)。
- 问题在于 OpenEvent 调用的所需访问标志不完整。
有问题的代码已经相应地修复并且可以正常工作。
如何在 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 -
(回答我自己,因为没有其他答案可以接受,但这不再是未回答的问题)。