【问题标题】:Visual c++ and Window ServicesVisual c++ 和窗口服务
【发布时间】:2016-05-15 12:10:19
【问题描述】:

这是我用 Visual C++ 6.0 编写的程序代码:

#include <Windows.h>
#include "stdafx.h"
#include <stdlib.h> 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

    while(true)
    {
        int sleepInterval = rand()%15;
        Sleep(sleepInterval*1000);

        WinExec("notepad.exe" ,SW_SHOWNORMAL);


    }
        return 0;
}

然后我移动由该代码生成的 *.exe 文件并将其移动到我的桌面。我从那里开始。一切正常,我的意思是记事本编辑器窗口不时出现。 然后我在命令提示符下使用以下命令创建了 Windows 服务: C:\Documents and Settings\Administrator>sc create ThemesService2 binPath= "C:\Documents and Settings\Administrator\Desktop\win32apphelloworld.exe" DisplayName= "Themes Service2" start= auto

命令提示符的结果是:[SC] CreateService SUCCESS 到这里一切都很好 - 创建了一个服务,它必须在 Windows 启动时自动启动。我重新启动。然后什么也没有发生,记事本中的窗口没有出现。我从“开始”菜单->“运行”打开 Services.msc。该服务在那里,但它的状态是空的,我的意思是它的状态不是“已启动”。它的“启动类型”应该是“自动”。 但它没有开始。我尝试用鼠标右键单击手动启动它,然后单击“开始”,然后出现一个消息框,上面写着:“错误 1053:服务没有及时响应启动或控制请求”。有人能告诉我这项服务没有启动的原因是什么吗? 谢谢

【问题讨论】:

  • 服务在不同的会话中运行,因此您不会看到任何记事本窗口。
  • 好吧,我不知道这个。好的,但是当我在 Services.msc 中检查服务时,即使我没有看到记事本窗口,服务状态也不应该仍然是“已启动”吗?目前它不是“开始”,我将自己理解为“未运行”?
  • 您的WinMain 永远不会返回,这与您收到的错误消息一致。也就是说,我不知道您是否可以从常规可原谅的情况下创建服务。需要一个服务来实现某些回调。

标签: c++ windows service


【解决方案1】:

Windows 服务程序不仅仅是一个 C++ 可执行文件,它还必须实现某些功能,例如提供服务入口点。在这种情况下,您必须调用 StartServiceCtrlDispatcher(以便 Windows 知道它应该开始与服务通信)但这还不够。请参阅MSDN Documentation for writing Service Programs。

另外,如果您希望服务能够与桌面交互,您需要在服务属性中选中“允许服务与桌面交互”。

编辑:如果您只想在 Windows 启动时自动运行程序,您可以随时add it to the startup folder 或appropriate registry key。

【讨论】:

  • 任务调度器是另一个注册应用程序以在某些事件上运行的地方。它提供了比启动文件夹更大的灵活性,并且不能轻易禁用。
猜你喜欢
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多