Windows平台自己建立服务过程(备忘)
VC 6.0好像没有现成的模板,需要自己编程,所以选用了Visual Studio 2005(VS2005)的VC++,主要参考资料来自MSDN,建立过程:
1. 在VS下创建一个“Windows 服务”项目;
2. 在“属性”窗口中,设置服务的 ServiceName 属性(注:ServiceName 属性的值必须始终与安装程序类(下面将谈到)中记录的名称匹配。如果更改此属性,则必须也更新安装程序类的 ServiceName 属性。);
3. 设置有关属性以确定服务的工作机制:CanStop、CanShutdown、CanPauseAndContinue等;
4. 访问代码编辑器,并为 OnStart 和 OnStop 过程填写所需的处理(同时也可以填写OnPause等);
重点说明OnStart()和OnStop():
OnStart为服务启动时执行的函数,所以为了实现服务目的,应在OnStart启用服务真正的工作内容(即服务要实现的功能),但由于OnStart必须要在30秒内返回,服务才能正常启动,所以不能在OnStart函数内做死循环实现服务功能,有三种方式可以解决:
(1) 可以在OnStart内启用一个新线程,然后在新线程里实现服务功能,而OnStart可能返回;如mythread = gcnew Thread( gcnew ThreadStart(this, &myservice::myserviceWinService::MyFuncThread));
(2) 可以在OnStart内启用一个新进程,让新进程完成服务功能,而OnStart可以返回;如:CreateProcessAsUser(…);
(3) 可以直接调用开启一个程序(exe),命令:ShellExecute(…)(注包含相应的头文件和库文件,MSDN可查到);
如果要定时检测系统的相关信息或性能时则可以加入一个服务器计时器System::Timers组件(可以在“工具箱”右击,“选择项”增加),在OnStart内使能它,以定时调用相关处理函数;
OnStop为服务停止时执行的函数,所以可以实现对启用服务时所开启资源的回收工作,中止开启的线程、进程、关闭相关程序等;
关闭程序:
HWND hWnd = ::FindWindowW(NULL, _T("填写程序的窗口标题"));
if (NULL != hWnd)
{
::SendMessage(hWnd, WM_CLOSE, 0, 0);
}
对于程序的窗口标题不断变化的应另用他法,暂没有实验;
5. 添加服务应用程序所必需的安装程序(具体参考MSDN:如何,将安装程序添加到服务应用程序),注意:ServiceProcessInstaller的Account和ServiceInstaller的StartType;
PS:ServiceInstaller的属性可以修改Discription和Dispayname, Discription为服务管理器显示的相关描述,而Dispayname为显法的名称;
6. 通过从“生成”菜单中选择“生成解决方案”来生成项目;
7. 完成服务程序输出;
8. 安装和卸载服务
(1)可以通过在cmd(命令行)下定位到生成的exe目录下(或者分别建安装和卸载的批文件(bat),放在与服务文件(exe)在同一目录下,分别执行完成安装和卸载!),
输入:程序名.exe –install 安装服务,或输入:程序名.exe –install –u卸载服务;
批文件:安装文件代码:程序名.exe –install (另一行)sc start (服务名)
卸载文件代码:程序名.exe –install –u
(2)建立安装项目,形成一个安装程序,直接运行安装程序就可以安装服务,具本参考MSDN:如何创建或添加部署项目;
9. 完成服务的建立过程;