TService不会处理消息

时间:2008-12-10 15:39:53

标签: delphi windows-services windows-messages

我创建了一个使用Windows Messaging System的Windows服务。当我从调试器测试应用程序时,消息很好地通过但是当我安装它时我的消息...在14分钟之前询问

弗拉基米尔 1tuga

3 个答案:

答案 0 :(得分:7)

服务通常不会收到窗口消息。它们根本不一定有窗口把手。即使他们这样做,他们也会在一个单独的桌面上运行。程序无法将消息从一个桌面发送到另一个桌面,因此服务只能从其他服务或服务启动的程序接收消息。

在Windows Vista之前,您可以将服务配置为与桌面交互。这使得服务在与登录用户相同的桌面上运行,因此以该用户身份运行的程序可以向服务的窗口发送消息。但是Windows Vista隔离了服务;他们不能再与任何用户的桌面交互。

还有许多其他方式与服务进行通信。它们包括命名管道,邮件槽,内存映射文件,信号量,事件和套接字。

例如,使用套接字,您的服务可以在开放端口上侦听,需要与之通信的程序可以连接到该端口。这可以打开远程管理的大门,但您也可以将服务限制为仅侦听本地连接。

以上所有内容都试图告诉你,你采取了错误的做法。但也有问题在于手头。您的程序在调试器中表现出一种方式,而在其他方面则表现不同。如果没有安装,你如何调试服务?您的服务运行的用户帐户是什么?你的调试器?您尝试了哪些不涉及调试器的调试技术(例如writeln到日志文件来跟踪程序的操作)?

答案 1 :(得分:5)

当你说它“使用”Windows Messaging System时,你是什么意思?您正在使用或发送Windows消息吗?

如果您发送Windows消息,则需要确保正确执行此操作。我建议编写一个消息循环,以确保您的消息正确分派。我还建议阅读消息循环及其工作原理。

What is a Message Loop(点击要转到此信息来源的标题)

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}
  1. 消息循环调用GetMessage(), 它会查看您的消息队列。 如果消息队列是空的你的 程序基本上停止并等待 为一个(它阻止)。
  2. 当发生事件导致a 要添加到队列中的消息 (例如系统注册a 鼠标单击)GetMessages()返回一个 正值表示有一个 要处理的消息,以及它 已经填写了MSG的成员 结构我们通过它。它返回0 如果它击中WM_QUIT,则为负数 发生错误时的值。
  3. 我们接受消息(在消息中 变量)并将其传递给 TranslateMessage(),这有点儿 额外处理, 翻译虚拟密钥消息 到字符消息。这一步 实际上是可选的,但确定 如果事情不存在,事情将无法奏效。
  4. 一旦完成,我们传递消息 到DispatchMessage()。什么 DispatchMessage()的确如此 消息,检查它是哪个窗口 for然后查找窗口 窗口的程序。然后呢 调用该程序,发送为 参数窗口的句柄, 消息,以及wParam和lParam。
  5. 在你的窗口程序中检查 消息及其参数,以及 做任何你想要的东西!如果 你没有处理具体的问题 消息,你几乎总是打电话 DefWindowProc()将执行 你的默认行动(哪个 通常意味着什么都不做。)
  6. 完成处理后 消息,你的Windows程序 返回,DispatchMessage()返回, 我们回到了开头 循环。

答案 2 :(得分:0)

谢谢大家的答案,  问题是操作系统(vista),我测试了我的Windows 2000,一切正常。

感谢Rob的光。