为什么第二次创建与已经存在的同名的Event对象,竟然提示成功,而不是该对象已经存在?

pingbo 2005-08-30 04:18:11
我用VC做了一个COM,其他有两个函数用来创建同名的一个Event,分另由一个NT Service和一个JAVA 程序通过JNI使用。首先由NT SERVICE在启动时创建一COM进程,并创建一个该EVENT对象,但在在这后,一个JAVA程序通过JNI来创建COM一个进程并创建与NT SERICE创建的EVENT对象,竟然提示创建成功了。代码如下:
由NT SERVICE在启动时调用:
m_hStoppedForWeb = CreateEvent(NULL,TRUE,FALSE,"StoppedForWeb");

由JAVA程序通过调用:

m_hStoppedForWeb = CreateEvent(NULL,TRUE,FALSE,"StoppedForWeb");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
m_hStoppedForWeb = OpenEvent(EVENT_ALL_ACCESS,FALSE,"StoppedForWeb");
if (m_hStoppedForWeb == NULL)
{
OutputDebugString("The StoppedForWeb event cannot be opened.");
}
else
{
OutputDebugString("Open the StoppedForWeb event successfully");
}
}




请问各位VCER这是什么原因啊?

先谢谢啦!
...全文
225 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxyjyzxyjy 2005-09-02
  • 打赏
  • 举报
回复
这样也就是说这个命名的事件在系统中只有一个,并不是两个啊。
还有就是没有别要再调用函数OpenEvent了,这是多余的。
zxyjyzxyjy 2005-09-02
  • 打赏
  • 举报
回复
你创建的过程是对的啊,MSDN对CreateEvent函数的帮助对反回值是这么说的:
Return Values
If the function succeeds, the return value is a handle to the event object. If the named event object existed before the function call, the function returns a handle to the existing object and GetLastError returns ERROR_ALREADY_EXISTS.
farfh 2005-08-31
  • 打赏
  • 举报
回复
m_hStoppedForWeb = OpenEvent(EVENT_ALL_ACCESS,FALSE,"StoppedForWeb");
这句话多余,另外,如果你是Service创建的Event,
m_hStoppedForWeb = CreateEvent(NULL,TRUE,FALSE,"StoppedForWeb");
这句话如果是在桌面程序中使用,则直接失败,错误返回不是已经存在,而是你无权访问,如果希望能被其他用户访问,一是让Service运行在你的程序启动的同一个用户下,还有一种办法是指定安全特性,要使用到CreateEvent的第一个参数,详见msdn上的Knowledge Base PSS ID Number: Q106387
HOWTO: Share Kernel Objects Between Processes
roscoe 2005-08-31
  • 打赏
  • 举报
回复
核心态与用户态是系统对象是相对独立的,除非你的NT SERVICE被设成可与桌面交互.
idAnts 2005-08-31
  • 打赏
  • 举报
回复
我是用Process Explorer看的。
www.sysinternals.com下载。

选种进程以后,下半截的view里面的内容选择“view handles”
pingbo 2005-08-31
  • 打赏
  • 举报
回复
To idAnts:
请问哪里可以看到 Event对象的名字。
pingbo 2005-08-30
  • 打赏
  • 举报
回复
To happyparrot:
没有被CloseHandle
idAnts 2005-08-30
  • 打赏
  • 举报
回复
是有这个问题。
当服务创建了一个内核对象以后,普通应用程序再创建的时候,实际上创建完的名字是类似这样“\BaseNamedObjects\mixercallback”,“\BaseNamedObjects\hardwaremixercallback”的名字了,而不是你程序里写的那个。
原因是什么,我也不知道。
idAnts 2005-08-30
  • 打赏
  • 举报
回复
是用Mutex吧。
快乐鹦鹉 2005-08-30
  • 打赏
  • 举报
回复
是不是哪里被CloseHandle了?
pingbo 2005-08-30
  • 打赏
  • 举报
回复
为什么不提示该EVENT对象已经存在了?

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧