求助关于理解服务进程的退出与主线程的退出

lygf666 2012-06-20 12:12:06
一般的服务的程序入口函数是main,

在main中做的事情非常简单,就是安装,注册服务进程的ServiceMain,代码如下:

void main( )
{
// 设置SERVICE_TABLE_ENTRY 数据结构,以NULL 结构结束,
// 作为StartServiceCtrlDispatcher 函数的参数。

SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ "Sample_Srv", (LPSERVICE_MAIN_FUNCTION) SplSrvServiceStart },
{ NULL, NULL }
};

if (!StartServiceCtrlDispatcher( DispatchTable))
{
SvcDebugOut(" [SPLSRV_SERVICE] StartServiceCtrlDispatcher (%d)\n",
GetLastError());
}
}
我第一眼看到这个流程的时候有些奇怪,调用StartServiceCtrlDispatcher后,函数返回的话,主线程不就要退出了(那也意味着这个进程都要退出了),服务主函数是靠新线程调用。 实际调试的时候发现, 当调用完StartServiceCtrlDispatcher后, main函数仿佛在等待一个看不见的事件对象, 只有当给该服务发送stop请求后,main函数才退出。实际的流程是这样的 吗? 还有求ide调试服务进程的方便办法,我的是加了一个15秒的定时器。然后看手快,用vc的调试附加进程。
...全文
95 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lygf666 2012-06-20
  • 打赏
  • 举报
回复
还有一个问题,有什么方面的方法用ide调试服务进程,windbg就算了,不大会用。 用计时器的方法也算了,我apm不高,有什么比较正统的好的调试方法。
lygf666 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

If StartServiceCtrlDispatcher succeeds, it connects the calling thread to the service control manager and does not return until all running services in the process have entered the SERVICE_STOPPED st……
[/Quote]

是我看msdn太不仔细了,谢谢了。 老喜欢敢。
Lactoferrin 2012-06-20
  • 打赏
  • 举报
回复
If StartServiceCtrlDispatcher succeeds, it connects the calling thread to the service control manager and does not return until all running services in the process have entered the SERVICE_STOPPED state.
lygf666 2012-06-20
  • 打赏
  • 举报
回复
再有最后一个问题, 这样的main函数默认都是有个控制台窗口的,我想要创建一个连没有控制台窗口的服务。应该怎么做。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧