在 Windows 服务和应用程序之间交换数据

问题描述 投票:0回答:1

我需要在 Windows 服务和“常规”应用程序之间交换数据。

为此,我使用共享内存(文件映射)和几个事件。

我使用“CreateEvent()”函数在服务中创建事件对象,在应用程序中我使用“OpenEvent()”函数。

服务中:

HANDLE hEvent = ::CreateEvent(NULL, FALSE, FALSE, "Global\service_event");

在应用程序中:

HANDLE hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "Global\service_event");

服务中的调用成功,但应用程序中的调用失败并给出最后一个错误 5 =“访问被拒绝”。

如果我“以管理员身份”执行应用程序,也会有相同的行为。

有人可以帮助我吗? 谢谢

windows service
1个回答
0
投票

缺少的是您在 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);
© www.soinside.com 2019 - 2024. All rights reserved.