我需要在 Windows 服务和“常规”应用程序之间交换数据。
为此,我使用共享内存(文件映射)和几个事件。
我使用“CreateEvent()”函数在服务中创建事件对象,在应用程序中我使用“OpenEvent()”函数。
服务中:
HANDLE hEvent = ::CreateEvent(NULL, FALSE, FALSE, "Global\service_event");
在应用程序中:
HANDLE hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "Global\service_event");
服务中的调用成功,但应用程序中的调用失败并给出最后一个错误 5 =“访问被拒绝”。
如果我“以管理员身份”执行应用程序,也会有相同的行为。
有人可以帮助我吗? 谢谢
缺少的是您在 CreateEvent 的第一个参数中指定的 LPSECURITY_ATTRIBUTES。这控制谁可以访问该事件以及他们可以用它做什么。
使用 NULL 作为第一个参数,使用默认描述符创建事件,以便仅系统用户可以访问该事件。
以下是创建 SECURITY_ATTRIBUTES 的示例。它将允许管理员完全控制事件。不包括错误检查或资源清理。
SECURITY_ATTRIBUTES sa {};
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;
ConvertStringSecurityDescriptorToSecurityDescriptor(
TEXT("(A;OICI;GA;;;BA)"),
SDDL_REVISION_1,
&(sa.lpSecurityDescriptor),
NULL);