【发布时间】:2009-10-12 11:32:45
【问题描述】:
我编写了一个“做事”的控制台程序——主要使用 boost。如何将其转换为 Windows 服务? 关于 Windows 服务,我应该事先了解什么?
【问题讨论】:
我编写了一个“做事”的控制台程序——主要使用 boost。如何将其转换为 Windows 服务? 关于 Windows 服务,我应该事先了解什么?
【问题讨论】:
There's a good example on how to set up a minimal service on MSDN。请参阅编写 main 函数、入口点以及示例代码的部分。
一旦您构建并运行了一个 Windows 服务,您就会发现下一个主要问题:调试起来很痛苦。没有终端(因此没有标准输出/标准错误),一旦您尝试运行可执行文件,它就会实际启动服务然后返回给您。
我发现一个非常有用的技巧是在您的应用程序中添加一个-foreground 选项,这样如果您使用该标志运行,它就会绕过服务启动代码,而是像常规控制台应用程序一样运行,这使得它大大更容易调试。在 VS.Net 中设置调试选项以使用该标志调用。
【讨论】:
msdn上有一个很好的例子here
这是一个样板 C++ 服务项目,具有自安装/卸载功能并将服务启动和停止事件记录到 Windows 事件日志。它可以像其他服务一样通过服务应用程序(snapin)停止和启动。您可能希望最初授予它 LocalSystem 权限以使其正常工作,因为在 xp 上至少它没有足够的权限来启动项目提供的 LocalService 权限。 Visual Studio 2008 项目开箱即用,尽管下载的说明另有说明。
有点晚了,但我希望这对其他人有帮助。
【讨论】:
【讨论】:
最简单的解决方案可能是在 Visual Studio 中创建一个新的 Windows 服务项目并将您的代码复制到新项目中。
如果您重构代码以便将 UI(在本例中为控制台)从逻辑中分离出来,您可以创建一个库来完成这项工作,然后从控制台项目和服务项目中调用它。
【讨论】:
您可以使用 Srvany 工具将应用程序配置为作为服务运行,该工具是 Windows Server 2003 Resource Kit Tools. 的一部分
【讨论】:
Srvany 同时只允许一项服务。所以我写了我的 srvany (sFany) 来让 nginx 和 php-cgi 作为 windows 服务一起运行。这里是来源https://github.com/stxh/sFany
【讨论】: