【问题标题】:Convert a C++ program to a Windows service?将 C++ 程序转换为 Windows 服务?
【发布时间】:2009-10-12 11:32:45
【问题描述】:

我编写了一个“做事”的控制台程序——主要使用 boost。如何将其转换为 Windows 服务? 关于 Windows 服务,我应该事先了解什么?

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    There's a good example on how to set up a minimal service on MSDN。请参阅编写 main 函数、入口点以及示例代码的部分。

    一旦您构建并运行了一个 Windows 服务,您就会发现下一个主要问题:调试起来很痛苦。没有终端(因此没有标准输出/标准错误),一旦您尝试运行可执行文件,它就会实际启动服务然后返回给您。

    我发现一个非常有用的技巧是在您的应用程序中添加一个-foreground 选项,这样如果您使用该标志运行,它就会绕过服务启动代码,而是像常规控制台应用程序一样运行,这使得它大大更容易调试。在 VS.Net 中设置调试选项以使用该标志调用。

    【讨论】:

    • 这里有一些有用的调试技巧(尤其是使用gflags自动启动调试器):support.microsoft.com/kb/824344
    • 是的,如果您在没有标志的情况下运行,那么服务将被安装并运行(这是服务需要工作的方式)。如果您使用 -foreground 选项运行,则它会绕过服务安装步骤。
    • 对于日志记录,您可以使用 log4cplus.sourceforge.netlog4cpp.sourceforge.net 之类的日志记录库,而不是写入标准输出。
    【解决方案2】:

    msdn上有一个很好的例子here

    这是一个样板 C++ 服务项目,具有自安装/卸载功能并将服务启动和停止事件记录到 Windows 事件日志。它可以像其他服务一样通过服务应用程序(snapin)停止和启动。您可能希望最初授予它 LocalSystem 权限以使其正常工作,因为在 xp 上至少它没有足够的权限来启动项目提供的 LocalService 权限。 Visual Studio 2008 项目开箱即用,尽管下载的说明另有说明。

    有点晚了,但我希望这对其他人有帮助。

    【讨论】:

      【解决方案3】:

      您也许可以使用 CodeProject 中的这个工具“包装它”:

      http://www.codeproject.com/KB/system/xyntservice.aspx

      值得一看。

      【讨论】:

        【解决方案4】:

        最简单的解决方案可能是在 Visual Studio 中创建一个新的 Windows 服务项目并将您的代码复制到新项目中。

        如果您重构代码以便将 UI(在本例中为控制台)从逻辑中分离出来,您可以创建一个库来完成这项工作,然后从控制台项目和服务项目中调用它。

        【讨论】:

        • 而不是剪切和粘贴将您的工作代码(- UI)作为库加载到服务中
        【解决方案5】:

        您可以使用 Srvany 工具将应用程序配置为作为服务运行,该工具是 Windows Server 2003 Resource Kit Tools. 的一部分

        【讨论】:

          【解决方案6】:

          Srvany 同时只允许一项服务。所以我写了我的 srvany (sFany) 来让 nginx 和 php-cgi 作为 windows 服务一起运行。这里是来源https://github.com/stxh/sFany

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多