所以,我有一个应用程序连接到一个库,该库处理不同线程中的许多不同任务。
在库的一个线程中,不库的主线程,创建一个事件。
但是,当我尝试从使用库本身的应用程序中打开事件时,我总是收到无效的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:
有趣;我忘了提到我实际上已经尝试过为事件使用全局命名空间,这显然也没有用。上面提到的同样的错误也是返回的......
答案 0 :(得分:4)
您的问题是由两个不幸的决定引起的:使用名称中包含非ASCII字符的事件,并调用API的ANSI版本(由尾随A
表示)。
由于系统在内部使用Unicode,因此无论何时调用ANSI API,字符串参数都将转换为Unicode。非ASCII字符的转换由线程的当前语言环境控制。这解释了为什么在同一个线程上对OpenEventA
的调用成功,而在另一个线程上调用失败。
要解决此问题,请将对ANSI API的调用替换为各自的Unicode版本CreateEventW
和OpenEventW
。
答案 1 :(得分:0)
它可能是EVENT_ALL_ACCESS标志。你真的需要它吗? 通常" SYNCHRONIZE | EVENT_MODIFY_STATE"足以举办活动。
试试并告诉我们。