【发布时间】:2010-09-07 16:31:13
【问题描述】:
因此,使用 Visual Studio 创建 Windows 服务相当简单。我的问题更深入一点,即究竟是什么使可执行文件可作为服务安装以及如何将服务编写为直接的 C 应用程序。我在这方面找不到很多参考资料,但我假设必须有一些我可以实现的接口,以便我的 .exe 可以作为服务安装。
【问题讨论】:
标签: c windows visual-studio windows-services
因此,使用 Visual Studio 创建 Windows 服务相当简单。我的问题更深入一点,即究竟是什么使可执行文件可作为服务安装以及如何将服务编写为直接的 C 应用程序。我在这方面找不到很多参考资料,但我假设必须有一些我可以实现的接口,以便我的 .exe 可以作为服务安装。
【问题讨论】:
标签: c windows visual-studio windows-services
将您的可执行文件设置为服务是其中的一部分,但实际上它通常由您使用的任何安装软件处理。您可以在测试时使用命令行 SC 工具(或者如果您不需要安装程序)。
重要的是您的程序必须在启动时调用 StartServiceCtrlDispatcher()。这会将您的服务连接到服务控制管理器并设置一个 ServiceMain 例程,它是您的服务主入口点。
ServiceMain(你可以随意调用它,但它似乎总是ServiceMain)然后应该调用RegisterServiceCtrlHandlerEx()来定义一个回调例程,以便操作系统可以在某些事件发生时通知你的服务。
以下是我几年前编写的服务中的一些 sn-ps:
设置为服务:
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;
}
【讨论】:
【讨论】:
基本上,您必须设置一些注册表设置以及要实现的一些接口。
看看这个:http://msdn.microsoft.com/en-us/library/ms685141.aspx
您对 SCM(服务控制管理器)感兴趣。
【讨论】:
我知道我参加聚会有点晚了,但我最近也有同样的问题,不得不在互联网上苦苦寻找答案。
我设法在 MSDN 中找到了这篇实际上奠定了基础的文章。我最终将这里的许多文件组合成一个包含我需要的所有命令的单个 exe,并添加了我自己的“void run()”方法,该方法在服务的整个生命周期中循环以满足我自己的需要。
对于有这个问题的其他人来说,这将是一个很好的开始,所以对于未来的搜索者来说,看看吧:
完整的服务示例 http://msdn.microsoft.com/en-us/library/bb540476(VS.85).aspx
【讨论】: