在没有Visual Studio的情况下创建Windows服务

时间:2020-03-05 18:47:02  来源:igfitidea点击:

因此,使用Visual Studio创建Windows服务非常简单。关于使可执行文件作为服务进行实际安装的实际内容以及如何将服务作为直接C应用程序编写的问题,我的问题要深一些。我在此上找不到很多参考,但是我想必须要实现一些接口,以便我的.exe可以作为服务安装。

解决方案

回答

希望这可以帮助:

http://support.microsoft.com/kb/251192

似乎我们只需要简单地针对二进制可执行文件运行该exe,即可​​将其注册为服务。

回答

基本上,我们必须设置一些注册表设置以及一些实现的接口。

检查一下:http://msdn.microsoft.com/en-us/library/ms685141.aspx

我们对SCM(服务控制管理器)感兴趣。

回答

将可执行文件设置为服务是其中的一部分,但实际上,它通常由我们使用的任何安装软件来处理。我们可以在测试时使用命令行SC工具(或者如果不需要安装程序)。

重要的是程序必须在启动时调用StartServiceCtrlDispatcher()。这会将服务连接到服务控制管理器,并设置ServiceMain例程,这是服务的主要入口点。

然后,应该将ServiceMain(我们可以随意调用它,但它似乎总是ServiceMain),然后应调用RegisterServiceCtrlHandlerEx()定义回调例程,以便OS在某些事件发生时可以通知服务。

以下是我几年前写的一项服务的摘要:

设置为服务:

SERVICE_TABLE_ENTRY ServiceStartTable[] =
{
   { "ServiceName", ServiceMain },
   { 0, 0 }
};

if (!StartServiceCtrlDispatcher(ServiceStartTable))
{
   DWORD err = GetLastError();
   if (err == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
      return false;
}

ServiceMain:

void WINAPI ServiceMain(DWORD, LPTSTR*)
{
    hServiceStatus = RegisterServiceCtrlHandlerEx("ServiceName", ServiceHandlerProc, 0);

服务处理程序:

DWORD WINAPI ServiceHandlerProc(DWORD ControlCode, DWORD, void*, void*)
{
    switch (ControlCode)
    {
    case SERVICE_CONTROL_INTERROGATE :
        // update OS about our status
    case SERVICE_CONTROL_STOP :
        // shut down service
    }

    return 0;
}

回答

我知道我参加聚会有点晚了,但是我最近也遇到了同样的问题,不得不在互联网上艰难地寻找答案。

我设法在MSDN中找到了这篇文章,而这篇文章的确奠定了基础。我最终将这里的许多文件合并到一个包含我需要的所有命令的exe文件中,并添加了我自己的" void run()"方法,该方法在服务的整个生命周期中都根据我的需要进行循环。

对于有这个问题的其他人来说,这将是一个不错的开始,因此对于将来的搜索者,请检查一下:

完整的服务样本
http://msdn.microsoft.com/zh-CN/library/bb540476(VS.85).aspx