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

标签 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

最佳答案

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

As pointed out by Hans Passant - 问题在于 OpenEvent 调用的所需访问标志不完整。 有问题的代码已经相应地修复并且可以正常工作。

关于c# - 对从托管代码创建的事件的 WaitForSingleObject 访问被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43791666/

相关文章:

python - 使用队列 Tensorflow 训练模型

c# - 当我向数组添加某些内容时,它不会向列表添加任何内容

c# - 删除早于某个日期的文件

c++ - 根据键的类型选择 map 或 unordered_map

c++ - MPI 可执行文件和共享标准输入

c - 并行化 vector 时的负加速 vector 点积

c# - 在 WPF 延迟后重置变量值

c# - 尝试为 bison/wisent 构建 C# 语法

c++ - 初始化变量之前是否调用了父类构造函数?

ios - 多线程GLKView绘图