4

我用 VC++ 编写了一个服务。我按照教程here。现在,我正在尝试了解如何接收 DBT_DEVICEARRIVAL、DBT_DEVICEREMOVECOMPLETE、WM_COPYDATA 等消息,就像具有顶级窗口的常规应用程序一样。在搜索它时,我遇到了这篇 MSDN 文章

在“广播消息”部分的最后几段中:

应用程序通过其顶层窗口的窗口过程接收消息。消息不会发送到子窗口。服务可以通过窗口过程或其服务控制处理程序接收消息。

但是几乎不可能找到任何如何做到这一点的例子。

  1. 如何将 WndProc 与我的服务相关联,以便它接收消息?

  2. 或者,我怎样才能让我的服务控制处理函数接收 Windows 消息?我的服务控制处理程序只有一个 DWORD 参数,而不是 WndProc 的 UINT、WPARAM、LPARAM 等。

我已经阅读了 1) 使用隐藏窗口和 2) 仅消息窗口等,但我认为我不能在服务中使用它们;不想。如果我能以 MSDN 提到的这两种方式中的任何一种方式完成它,我会很高兴。

服务说明:

该服务将检测 USB 设备插入并将一些文件复制到它。它还必须跟踪对某些目录和文件的更改,以便知道要复制哪些。

将来,此基本功能可能会扩展到包括其他内容。因此,我可能必须能够接收许多我现在不知道的其他 Windows 消息。

上面提到的示例消息只是取自我在开发常规 Windows 应用程序时所习惯的。在编写服务时,我了解它们是否不合适或不安全。

4

2 回答 2

3

嗯,您只需创建一个普通的消息循环,就像您编写 Win32 窗口应用程序的纯 C 实现一样 - 不涉及任何框架。

例子:

while(GetMessage(...)) ...

您可以使用PeekMessageGetMessage(请参阅链接的文档)。但后者更传统,并将其从消息队列中删除。

即你甚至不需要窗户。每个线程都可以有一个消息循环。所以它会阻塞,但只有当前线程。您必须自己弄清楚如何将信息传递给需要它的其他线程。

不过

但是,与其努力妥协 MS 为你设置的东西,以免你的下半身被炸掉,你应该在 Wikipedia 上阅读有关 Shatter Attacks 的信息,并为服务使用适当的IPC技术(从 MMF 到管道,有很多可用的技术)与信号量、互斥体和事件的组合)。

如果您打算在用户桌面上接收窗口消息但使用您的特权上下文(无论如何都应该阻止会话分离),这部分是相关的。

于 2013-02-28T18:12:08.540 回答
1

使用带有HandlerEx回调函数的RegisterServiceCtrlHandlerEx函数。

是的,正如0xC0000022L所指出的,最好使用 IPC 技术,例如命名管道——我最喜欢的。:)

于 2013-02-28T18:14:00.320 回答