在平时的开发的过程中会涉及到一些系统服务或用户自定义服务的操作.下面主要从两方面简单讲述服务的操作:
一. 对现有服务的操作:
1.任务的服务操作第一步必须打开服务管理对象: OpenSCManager();
2.通过"服务显示名称"(Display Name)获取"服务名称"(Service Name): GetServiceKeyName();
显示名称可以直接打开系统服务上面直接看到,入下图:
3.对打开的服务进行停止,暂停等操作:ControlService ();
4.开启服务: StartService();
5.最后就是对打开的服务句柄进行关闭释放资源操作: CloseServiceHandle()
二. 创建新的服务:
创建一个新的服务: CreateService();返回的是新服务的句柄,然后可以调用上述的函数对服务进行操作.
如果需要删服务则直接调用: DeleteService()删除服务;
下面以Wireless Zero Configuration服务为例对现有系统服务进行开启和停止操作,代码如下:
SC_HANDLE scHandle = NULL;
SC_HANDLE hService = NULL;
SERVICE_STATUS status;
char szSvName[32] = {'\0'};
DWORD dwLen = 32;
//打开服务管理对象
scHandle = OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ALL_ACCESS);
if (scHandle)
{
//获取指定服务的服务名
if(GetServiceKeyName(scHandle,"Wireless Zero Configuration",szSvName,&dwLen))
{
hService = OpenService(scHandle,szSvName,SC_MANAGER_ALL_ACCESS); //打开服务
if(hService)
{
// 获得服务的状态
if( ::QueryServiceStatus( scHandle, &status) == FALSE)
{
::CloseServiceHandle( hService);
::CloseServiceHandle( scHandle);
return;
}
//如果处于停止状态则启动服务,否则停止服务。
if( status.dwCurrentState == SERVICE_RUNNING)
{
// 停止服务
if( ::ControlService( hService,SERVICE_CONTROL_STOP, &status) == FALSE)
{
::CloseServiceHandle( hService);
::CloseServiceHandle( scHandle);
return;
}
// 等待服务停止
while( ::QueryServiceStatus( hService, &status) == TRUE)
{
::Sleep( status.dwWaitHint);
if( status.dwCurrentState == SERVICE_STOPPED)
{
::CloseServiceHandle( hService);
::CloseServiceHandle( scHandle);
return;
}
}
}
else if( status.dwCurrentState == SERVICE_STOPPED)
{
// 启动服务
if( ::StartService( hService, NULL, NULL) == FALSE)
{
::CloseServiceHandle( hService);
::CloseServiceHandle( scHandle);
return;
}
// 等待服务启动
while( ::QueryServiceStatus( hService, &status) == TRUE)
{
::Sleep( status.dwWaitHint);
if( status.dwCurrentState == SERVICE_RUNNING)
{
::CloseServiceHandle( hService);
::CloseServiceHandle( scHandle);
return;
}
}
}
::CloseServiceHandle( hService);
}
}
}
::CloseServiceHandle( scHandle);