从我的应用程序中打开由我的服务创build的Event对象

我创build了一个Windows服务。 我正在创build一个事件“testing”。 我想用我的应用程序设置/重置相同的事件对象。 但我似乎没有通过我的应用程序获取事件对象的句柄。 但是可以看到在BaseNamed对象中列出的事件。

我想我需要用create Event的安全属性来做一些事情。

我在我的服务中创build这个事件

CreateEvent(NULL,TRUE,FALSE,TEXT(“Test”))

并在我的应用程序中使用OpenEvent。

OpenEvent(EVENT_ALL_ACCESS,TRUE,TEXT(“Test”))

请build议我需要做什么更改,为我的应用程序来处理。

更新

TEXT("Test") with TEXT("Global\\Test")代替TEXT("Test") with TEXT("Global\\Test") 。 仍然我没有得到事件对象的句柄。 是的,现在至less它认识到错误返回(拒绝访问)的事件对象的存在。 这是得到一个错误返回(系统无法find指定的文件)。 正如我所说,我认为这里有一些安全方面。 这是我发现:因为会话创build会话0中的事件。它不能被我在第1会议中创build的应用程序inheritance。为创buildEvent对象,我需要指定安全属性结构适当的安全调度员这样做。 有人可以告诉我该怎么做吗?

尝试这个:

 PSECURITY_DESCRIPTOR psd = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); InitializeSecurityDescriptor(psd, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(psd, TRUE, NULL, FALSE); SECURITY_ATTRIBUTES sa = {0}; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = psd; sa.bInheritHandle = FALSE; HANDLE hEvent = CreateEvent(&sa, TRUE, FALSE, TEXT("Global\\Test")); LocalFree(psd); 

 HANDLE hEvent = OpenEvent(SYNCHRONIZE, FALSE, TEXT("Global\\Test")); 

服务和应用程序可能会在不同的会话中运行,并且您需要使用“全局”内核对象名称空间前缀来使服务和应用程序都可以看到该对象。

请参阅MSDN上的内核对象名称空间中的示例和说明:

独立的客户端会话名称空间使多个客户端可以运行相同的应用程序,而不会相互干扰。 对于在客户端会话下启动的进程,系统默认使用会话名称空间。 但是,这些进程可以通过将“全局”前缀添加到对象名称来使用全局名称空间。 例如,下面的代码调用CreateEvent并在全局名称空间中创建一个名为CSAPP的事件对象:

CreateEvent( NULL, FALSE, FALSE, "Global\\CSAPP" );

也可以看看:

  • Windows服务无法看到命名的信号量

由于默认事件安全性可能会拒绝来自应用程序的访问,因此您需要在创建事件后立即对其进行更新,并准备好将其公开。

  • API: SetSecurityDescriptorDacl和朋友。
  • 代码片段: 在服务应用程序中为完全访问配置DACL – 事件信号量