Win32 API事件 - 在不同进程的访问方面有哪些限制?

时间:2015-03-26 18:43:06

标签: c++ multithreading winapi ipc

所以,我有一个应用程序连接到一个库,该库处理不同线程中的许多不同任务。

在库的一个线程中,库的主线程,创建一个事件。

但是,当我尝试从使用库本身的应用程序中打开事件时,我总是收到无效的HANDLE

该事件不使用私有命名空间,也没有为Win32的内核对象命名空间指定任何选项 - 这是非常默认的。

实际上,这是用于在库线程中创建事件的函数:

CreateEventA(NULL, FALSE, FALSE, eventName);

在同一个线程中稍后调用以使用以下参数打开事件是有效的:

OpenEventA(EVENT_ALL_ACCESS, FALSE, eventName); // returns event without issue

此外,根据MSDN,以下是here

The creating thread can also specify a name for the event object. Threads in other processes can open a handle to an existing event object by specifying its name in a call to the OpenEvent function.

显然这也不是错误,因为重复相同的要点here

The process that creates an object can use the handle returned by the creation function (CreateEvent, CreateMutex, CreateSemaphore, or CreateWaitableTimer). Other processes can open a handle to the object by using its name, or through inheritance or duplication.

我已经通过MSDN查找了一些明确说明不会出现这种情况的情况,我还没有找到任何东西。

我还可以说,在查询应用程序中的事件时,我已经看到了库中线程中的事件处于活动状态 - 据我所知,它排除了它根本无法创建的可能性。

当有人通过应用程序查询时,有人可以了解事件从OpenEvent返回NULL的原因吗?

更新

回应@FrerichRaabe:

返回的错误代码为2,或ERROR_FILE_NOT_FOUND

@IInspectable:

有趣;我忘了提到我实际上已经尝试过为事件使用全局命名空间,这显然也没有用。上面提到的同样的错误也是返回的......

2 个答案:

答案 0 :(得分:4)

您的问题是由两个不幸的决定引起的:使用名称中包含非ASCII字符的事件,并调用API的ANSI版本(由尾随A表示)。

由于系统在内部使用Unicode,因此无论何时调用ANSI API,字符串参数都将转换为Unicode。非ASCII字符的转换由线程的当前语言环境控制。这解释了为什么在同一个线程上对OpenEventA的调用成功,而在另一个线程上调用失败。

要解决此问题,请将对ANSI API的调用替换为各自的Unicode版本CreateEventWOpenEventW

答案 1 :(得分:0)

它可能是EVENT_ALL_ACCESS标志。你真的需要它吗? 通常" SYNCHRONIZE | EVENT_MODIFY_STATE"足以举办活动。

试试并告诉我们。