摘要:上一篇文章《Windows Service服务程序(0)服务主函数 & 控制处理函数》对Windows服务开发做了初步讲解。服务编写完成后,还需要服务管理程序才可以运行。一种方式是上篇文章中介绍的使用系统服务管理工具,如sc.exe等;另一种方式是使用Windows服务管理API自行编写服务管理程序。
目录:
本文介绍如何通过系统提供的API函数,对上一篇文章中开发的服务程序进行控制。
创建服务
向系统创建服务,创建时指定相应的服务属性,CreateService
函数参数基本上从名称就能知道具体意思了,原型如下:
CreateServiceA(
_In_ SC_HANDLE hSCManager, //SCM句柄
_In_ LPCSTR lpServiceName, //服务名
_In_opt_ LPCSTR lpDisplayName, //显示的服务名
_In_ DWORD dwDesiredAccess, //存取权限
_In_ DWORD dwServiceType, //服务类别
_In_ DWORD dwStartType, //启动类别
_In_ DWORD dwErrorControl, //错误控制类别
_In_opt_ LPCSTR lpBinaryPathName, //服务的可执行文件路径
_In_opt_ LPCSTR lpLoadOrderGroup, //用户组
_Out_opt_ LPDWORD lpdwTagId, //标签
_In_opt_ LPCSTR lpDependencies, //服务独立性
_In_opt_ LPCSTR lpServiceStartName, //系统账户
_In_opt_ LPCSTR lpPassword //密码
);
CreateService被宏定义为两套函数,分别为CreateServiceW和CreateServiceA,主要区别是前面为Unicode编码,后面为ASCII编码。以下直接使用CreateServiceA
函数,一般不这么用,而用CreateService函数。
/*创建服务*/
int createService(SC_HANDLE schSCManager, LPSTR szPath, LPSTR szServiceName){
SC_HANDLE schService = CreateServiceA(schSCManager, szServiceName, "demo_srv",
SERVICE_ALL_ACCESS, //存取权限
SERVICE_WIN32_OWN_PROCESS, //服务类别
SERVICE_DEMAND_START, //启动类型
SERVICE_ERROR_NORMAL, //错误控制类别
szPath, NULL, NULL, NULL, NULL, NULL);
if (schService == NULL){
printf("Create service failed (%d).\n", GetLastError());
return -1;
}
printf("Create service succeeded.\n");
CloseServiceHandle(schService);
schService = NULL;
return 0;
}
删除服务
调用OpenService函数打开服务,获得服务句柄,然后使用DeleteService
删除服务,该原型如下:
DeleteService(
_In_ SC_HANDLE hService
);
删除服务是最简单的操作,可以封装成以下函数:
/*删除服务*/
int deleteService(SC_HANDLE schSCManager, LPSTR szServiceName){
SC_HANDLE schService = OpenServiceA(schSCManager, szServiceName, DELETE);
if (schService == NULL){
printf("OpenService failed (%d).\n", GetLastError());
return -1;
}
if (!DeleteService(schService)){
printf("Delete service failed (%d).\n", GetLastError());
return -2;
}
printf("Delete service succeeded.\n");
CloseServiceHandle(schService);
schService = NULL;
return 0;
}
启动服务
启动服务StartService
,有三个参数:服务的句柄,参数个数,参数列表指针。具体函数原型如下:
StartServiceA(
_In_ SC_HANDLE hService,