我用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这是什么原因啊?先谢谢啦!

解决方案 »

  1.   

    为什么不提示该EVENT对象已经存在了?
      

  2.   

    是有这个问题。
    当服务创建了一个内核对象以后,普通应用程序再创建的时候,实际上创建完的名字是类似这样“\BaseNamedObjects\mixercallback”,“\BaseNamedObjects\hardwaremixercallback”的名字了,而不是你程序里写的那个。
    原因是什么,我也不知道。
      

  3.   

    To happyparrot:
       没有被CloseHandle
      

  4.   

    To idAnts:
        请问哪里可以看到 Event对象的名字。
      

  5.   

    我是用Process Explorer看的。
    www.sysinternals.com下载。选种进程以后,下半截的view里面的内容选择“view handles”
      

  6.   

    核心态与用户态是系统对象是相对独立的,除非你的NT SERVICE被设成可与桌面交互.
      

  7.   

    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
      

  8.   

    你创建的过程是对的啊,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. 
      

  9.   

    这样也就是说这个命名的事件在系统中只有一个,并不是两个啊。
    还有就是没有别要再调用函数OpenEvent了,这是多余的。