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

8

使用Visual Studio创建Windows服务相对简单。我的问题更深入,是关于什么使可执行文件可以安装为服务以及如何编写纯C应用程序的服务。我找不到很多相关参考资料,但我认为必须有一些接口可以实现,以便我的.exe文件可以安装为服务。

4个回答

3

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

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

ServiceMain(实际上您可以随便取名字,但似乎总是叫ServiceMain)然后应该调用RegisterServiceCtrlHandlerEx()来定义回调例程,以便操作系统在发生某些事件时通知您的服务。

以下是我几年前编写的一个服务的一些片段:

设置为服务:

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;
}

1

我知道我有点晚来参加这个派对,但最近我也遇到了同样的问题,不得不在互联网上苦苦寻找答案。

我设法在 MSDN 上找到了这篇文章,确实奠定了基础。最终,我将这里的许多文件合并成一个包含我需要的所有命令的单个 exe 文件,并添加了自己的“void run()”方法,以满足自己的需求。

对于其他有着完全相同问题的人来说,这将是一个很好的起点,因此,对于未来的搜索者,请查看以下内容:

完整的服务示例 http://msdn.microsoft.com/en-us/library/bb540476(VS.85).aspx


1

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接