如何在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的访问被拒绝
(回答我自己,因为没有其他答案可以接受,但这不再是没有答案的问题)。
正如Hans Passant指出的那样-问题是OpenEvent调用的所需访问标志不完整。有问题的代码已经相应地固定并且可以正常工作。