服务应用程序和一般应用程序的差异
之所以写这个Topic,主要是因为在网络上看到有很多人告诉用户使用 sc.exe 或其他工具把一个一般的应用程序注册为服务,结果无法运行的问题。
我想在这里澄清的内容有:
- 服务应用程序不同于一般的应用程序。
- 不是所有的可执行文件都可以作为服务运行的。
1、一般可执行文件的入口点是main或者winmain,服务应用程序的启动也是由winmain进入的,但是对于服务应用程序执行的服务来说,其真正的入口点是 ServiceMain。关于 ServiceMain 的解释,MSDN里面是这样说的:
A ServiceMain function is the starting point for a service.
换句话说,如果没有这个函数,那么这个服务是不能够启动的。因为Windows无法找到这个服务的入口点。
2、并不是所有的可执行文件都有 ServiceMain 函数的,也就是说并不是所有的可执行文件都能够以服务的形式运行。以notepad为例,如果使用 sc 命令强行将notepad注册为一个服务应用程序:
sc create notepad binpath= c:\windows\system32\notepad.exe
并试图启动他,Windows会报告一个错误:
The notepad service failed to start due to the following error:
The service did not respond to the start or control request in a timely fashion.
出现这个现象是英文 Windows 无法找到这个服务的入口点,从任务管理器里面可以看到notepad进程出现一会儿以后就自动退出了。
结论:只有专门为服务设计的程序框架才能够注册为服务,并不是所有的可执行文件都能够以服务运行。不过使用Windows Resource Kit里面的srvany.exe通过一些配置可以让普通的应用程序也能以服务的方式运行。关于srvany.exe的说明请参阅srvany.exe文档。
注意:如果一个进程的用户名为SYSTEM,不等于说这个进程就一定属于服务应用程序。
限于个人水平有限,文中难免有错,请指正。