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

标签 c windows visual-studio windows-services

因此,使用 Visual Studio 创建 Windows 服务相当简单。我的问题更深入一些,关于什么实际上使可执行文件可安装为服务以及如何将服务编写为直接 C 应用程序。我找不到很多关于此的引用资料,但我假设必须有一些我可以实现的接口(interface),以便我的 .exe 可以作为服务安装。

最佳答案

将可执行文件设置为服务是其中的一部分,但实际上它通常由您使用的任何安装软件处理。您可以在测试时使用命令行 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;
}

服务主体:

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

关于在没有 Visual Studio 的情况下创建 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41699/

相关文章:

c++ - C/C++ 读写长字符串到文件

c - 如何将 C 中的多行宏与行尾的注释结合起来

.net - 无法加载文件或程序集 - 该模块应包含程序集 list

c++ - 从 dll 中获取 DLL 的名称

visual-studio - 有什么方法可以将项目分组到项目管理器的文件夹中吗?

visual-studio - 如何在 Visual Studio 2015 中创建 MVC 5 项目

c# - 如何在 android 项目属性中启用调试 (Xamarin Android)

c - 从链表中添加和删除节点

c++ - ZeroMQ 不能发送两次然后接收两次,中间什么也没有

c - 处理输入文件时如何向前看(处理 2 行)