停止关于Windows服务的问题

zerolu 2005-06-18 12:58:22
我写了一个服务程序,但我希望在处理"停止服务"(SERVICE_CONTROL_STOP)的请求时,处理一个特殊处理: 如果目前我的服务程序不能被停止(如:一个客户正在使用服务), 我希望给服务管理器返回一个错误信息,并且拒绝停止服务.

于是我这样处理:在处理服务控制消息的HandlerProc函数中,如果收到"SERVICE_CONTROL_STOP"消息时,服务不能被停止,我就调用SetServiceStatus设置状态的dwCurrentState为SERVICE_RUNNING,并在dwWin32ExitCode中填一个错误代码.

但这样处理的结果并非是我期望的:在服务管理器上执行"停止"时,服务管理器提示"本地计算机无法终止xxxx服务. 服务器并未返回错误. .....", 此时服务仍处于运行状态.(这里虽然处于运行状态,但是却没有提供返回的错误信息.) 但是如果接着再执行"停止",出人意料的事情出现了,控制消息处理函数HandlerProc()并未被调用,服务直接就被结束了!

非常具有讽刺意味的是,如果我在收到"SERVICE_CONTROL_STOP"时,SetServiceStatus设置状态dwCurrentState为SERVICE_STOPPED,并且在dwWin32ExitCode中填一个错误代码,服务管理器在执行"停止"时,会出现提示"在 本地计算机 无法终止xxxx服务, 错误.......",这个提示正是我期望出现的,然而,此时服务却并非像提示("无法终止")中的那样, 立即结束了. :(

请问,如果才能实现我前面提到的需求呢(即:试图停止服务时,给出错误提示,并拒绝停止服务,无论尝试多少次,只要条件未达到,都不允许停止).

(BTW, 我的操作系统是XP Professional SP2)
...全文
399 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zerolu 2005-06-22
  • 打赏
  • 举报
回复
我今天把程序拿到Win2000下试了一下,没什么问题。可以在收到SERVICE_STOP时,设置状态为"STOP_PENDING"这里可以返回一个错误码,然后服务管理器在超时(或用户点了终止)后给出这个错误码的错误提示。 当再次设置状态为“RUNNING”后,用户可以再次尝试“停止服务”,然后重复上述过程(我在我的XP SP2下,用户第二次尝试“停止服务”,结果是我的服务的HandlerProc函数未被调用,服务直接被终止,但在Win2000 Professional 下就没这个问题)。

为什么在XP下就不行呢,搞不懂:(

另外,在XP下,用任务管理器可以直接终止服务的进程,Win2000下就不行。差别太多了,郁闷ing...
zerolu 2005-06-21
  • 打赏
  • 举报
回复
谢谢 idAnts(你才无聊呢), 我又试了一下,这种方法可行,我原来试的时候有个地方搞错了,但是我要自己动态检查服务是否满足退出条件,总觉得不是很爽.


谢谢 wangk(倒之), 先改为"STOP_PENDING"在超时后可以提示期望的错误码,重新设为"RUNNING"后,在服务管理器中也能看到状态恢复为"已启动",但再次执行停止时,仍然没有调用HandlerProc()而直接终止服务了.

谢谢 taianmonkey(),这确实是一种可行的办法,但一旦设置成"STOP_PENDING"之后,就要求服务必须最终能自动停止,这样做我觉得不友好,因为用户点停止"服务",而此时服务正忙不能停止,而当服务恢复为空闲时就必须要自动停止了,这样用户也搞不清楚这个服务是在什么时候,怎样停止的了.

谢谢 bager(柏哥) , 服务没有用向导生成(还可以用向导生成服务么?这个我还不清楚啊,在哪?),是手工写的代码,做过各种检查,确实发现系统没用调用HandlerProc函数。你试过一下,没发现异常,那请问你的测试代码能否发过我看看:newleafnet@263.net, 谢谢。
taianmonkey 2005-06-21
  • 打赏
  • 举报
回复
标志设置为SERVICE_STOP_PENDING
bager 2005-06-21
  • 打赏
  • 举报
回复
〉 但这样处理的结果并非是我期望的:在服务管理器上执行"停止"时,服务管理器提示"本地计算机无法终
〉止xxxx服务. 服务器并未返回错误. .....", 此时服务仍处于运行状态.(这里虽然处于运行状态,但是却
〉没有提供返回的错误信息.) 但是如果接着再执行"停止",出人意料的事情出现了,控制消息处理函数
〉HandlerProc()并未被调用,服务直接就被结束了!

这种情况不应该出现。
确认一下服务程序中是否有异常退出的可能性,
另问服务程序不是由ATL向导生成的吧?(我试了一下,未见异常)
wangk 2005-06-21
  • 打赏
  • 举报
回复
你先将dwCurrentState改为STOP_PENDING,然后在超时后设置状态的dwCurrentState为SERVICE_RUNNING,并在dwWin32ExitCode中填一个错误代码。试一试看看可行吗?
wangk 2005-06-20
  • 打赏
  • 举报
回复
我想你应该拒绝,然后自己弹出提示框告诉客户,服务此时不能停止。
dwWin32ExitCode只有当程序退出是,系统才会收到。
idAnts 2005-06-20
  • 打赏
  • 举报
回复
你可以先试试在不接受停止时SERVICE_STATUS里的dwControlsAccepted设置去掉SERVICE_ACCEPT_STOP,比如在开始运行的时候,当完成任务接受停止的时候再加上它。
zerolu 2005-06-20
  • 打赏
  • 举报
回复
我尝试过很多组合,都没办法完美的实现这个需求:
"如果目前我的服务程序不能被停止(如:一个客户正在使用服务), 我希望给服务管理器返回一个错误信息,并且拒绝停止服务."
zerolu 2005-06-20
  • 打赏
  • 举报
回复
谢谢" idAnts(你才无聊呢)", 但是 dwControlsAccepted好像是不能动态改变的,只是在第一次调用时,才有效,我后面再调用就没什么效果了.

谢谢"wangk(倒之)", 我是没有停止服务,但windows"服务管理器"却不接受我的处理:第一次按停止时,服务管理器会给出提示"服务没有被停止",但第二次使用停止时,"出人意料的事情出现了,控制消息处理函数HandlerProc()并未被调用,服务直接就被结束了!"
zerolu 2005-06-19
  • 打赏
  • 举报
回复
呜呜呜,怎么没人关心呢 ~~~~

2,641

社区成员

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

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