好久没来写技术文章,归结原因依旧是很忙。
有时间就多写一些吧。
最近有朋友在我的 开源 服务器 上做了一个windows服务版本,挺有趣,于是我想把这个功能和我的服务器做一个整合,一开始并不顺利,原因是自己对windows服务的流程不熟悉。走了一些弯路,在这里记录下来,供大家参考。
其实windows下的服务和 Linux 下的服务大相径庭,linux下的步骤大概在7步,实际上一个function即可完成,windows下的服务必须先注册,再运行,当然,如果你想删除服务,还的有一个删除的步骤。
这篇文章先讨论windows下的服务开启和启动。
首先,先要了解一个类, ACE _NT_Service
这个类是一个标准的windows服务类,我们要创建一个自己的服务,就必须先继承它,
这里有几个函数,我需要再这里说明一下。 svc() 这个函数是用来处理服务运行的,你可以在这里添加你的任意代码,比如一个死循环,或者一个你需要执行的函数。
handle_control ()函数是当windows service管理控制器被操作的时候,比如点击运行,暂停,停止,重新运行等,会对应这些消息被投递到这里。control_code就是这些消息类型。你可以case一下,用作你的处理。
handle_exception ()是当异常发生的时候,通知windows service你的进程当前的状态,从而统一service管理器对你的服务状态的完整监控。
好了,知道以上几个接口,基本能够完成windows service的所有控制了。
那么下面,我们来看怎么控制。 这行代码是必要的,这个宏的意思是说,把Service对应的接口绑定给 CProgramService类,也就是你的 ACE_NT_Service。
为了方便测试服务的启动和注册,借用一下ACE例子里面的一个类。 最后,在Main函数里面,添加一行语句即可 这里要说明,并不是这些代码写好了,你就可以直接点运行了,这样你的服务是肯定起不来的。
首先,要注册服务。
你需要打开cmd窗口,切换到你的工程目录下,找到你的exe文件。然后注册一个你的服务。
比如我这个程序, freeeyes.exe -i
注册成功什么都不显示,程序退出,否则显示错误信息。
然后找到"我的电脑" 右键"服务",打开windows服务窗口,查找你添加的服务名称。
然后点击运行
这样,你的服务就启动了。
如果你想删除服务,也简单,同样到cmd下, freeeyes.exe -r 即可。
这里得说一下ACE windows服务下的一些容易出错的地方。
你或许会觉得这段代码永远不会被执行 实际上,这段代码非常重要,在你的服务注册以后,当启动的时候,windows服务管理器会直接运行freeeyes.exe,这个程序,这时候,代码会自己走到这个里面调用 ACE_NT_SERVICE_RUN这个宏,实际上,只有当 freeeyes这个服务正确注册的时候,才会被启动,否则会返回1053错误。这里一定要注意。还有,要运行这个测试用例,一定要把 ACEd.dll拷贝到当前目录下啊。否则服务会因为找不到dll而启动不起来。
好啦,废话少说,把我的这个样例代码贴在下面吧。
此代码windows7 ACE6.1.0下测试通过。
有时间就多写一些吧。
最近有朋友在我的 开源 服务器 上做了一个windows服务版本,挺有趣,于是我想把这个功能和我的服务器做一个整合,一开始并不顺利,原因是自己对windows服务的流程不熟悉。走了一些弯路,在这里记录下来,供大家参考。
其实windows下的服务和 Linux 下的服务大相径庭,linux下的步骤大概在7步,实际上一个function即可完成,windows下的服务必须先注册,再运行,当然,如果你想删除服务,还的有一个删除的步骤。
这篇文章先讨论windows下的服务开启和启动。
首先,先要了解一个类, ACE _NT_Service
这个类是一个标准的windows服务类,我们要创建一个自己的服务,就必须先继承它,
这里有几个函数,我需要再这里说明一下。 svc() 这个函数是用来处理服务运行的,你可以在这里添加你的任意代码,比如一个死循环,或者一个你需要执行的函数。
handle_control ()函数是当windows service管理控制器被操作的时候,比如点击运行,暂停,停止,重新运行等,会对应这些消息被投递到这里。control_code就是这些消息类型。你可以case一下,用作你的处理。
handle_exception ()是当异常发生的时候,通知windows service你的进程当前的状态,从而统一service管理器对你的服务状态的完整监控。
好了,知道以上几个接口,基本能够完成windows service的所有控制了。
那么下面,我们来看怎么控制。 这行代码是必要的,这个宏的意思是说,把Service对应的接口绑定给 CProgramService类,也就是你的 ACE_NT_Service。
为了方便测试服务的启动和注册,借用一下ACE例子里面的一个类。 最后,在Main函数里面,添加一行语句即可 这里要说明,并不是这些代码写好了,你就可以直接点运行了,这样你的服务是肯定起不来的。
首先,要注册服务。
你需要打开cmd窗口,切换到你的工程目录下,找到你的exe文件。然后注册一个你的服务。
比如我这个程序, freeeyes.exe -i
注册成功什么都不显示,程序退出,否则显示错误信息。
然后找到"我的电脑" 右键"服务",打开windows服务窗口,查找你添加的服务名称。
然后点击运行
这样,你的服务就启动了。
如果你想删除服务,也简单,同样到cmd下, freeeyes.exe -r 即可。
这里得说一下ACE windows服务下的一些容易出错的地方。
你或许会觉得这段代码永远不会被执行 实际上,这段代码非常重要,在你的服务注册以后,当启动的时候,windows服务管理器会直接运行freeeyes.exe,这个程序,这时候,代码会自己走到这个里面调用 ACE_NT_SERVICE_RUN这个宏,实际上,只有当 freeeyes这个服务正确注册的时候,才会被启动,否则会返回1053错误。这里一定要注意。还有,要运行这个测试用例,一定要把 ACEd.dll拷贝到当前目录下啊。否则服务会因为找不到dll而启动不起来。
好啦,废话少说,把我的这个样例代码贴在下面吧。
此代码windows7 ACE6.1.0下测试通过。