要启动服务,以下示例打开已安装数据库的句柄,然后指定调用StartService函数中的句柄。它可用于启动服务或驱动程序服务,但此示例假定服务正在启动。开始服务后,程序将使用QueryServiceStatus函数返回的SERVICE_STATUS结构的成员来跟踪服务的进度。
VOID StartSampleService()
{
SERVICE_STATUS ssStatus;
DWORD dwOldCheckPoint;
schService = OpenService(
schSCManager, // SCM数据库
TEXT("Sample_Srv"), // 服务名称
SERVICE_ALL_ACCESS);
if (schService == NULL)
MyErrorExit("OpenService");
if(!StartService(
schService, //处理服务
0, //参数数量
NULL) ) //没有参数
{
MyErrorExit("StartService");
}
其他
printf("Service start pending\n");
//检查状态,直到服务运行。
if(!QueryServiceStatus(
schService, //处理服务
&ssStatus) ) //状态信息的地址
MyErrorExit("QueryServiceStatus");
while (ssStatus.dwCurrentState != SERVICE_RUNNING)
{
//保存当前检查点。
dwOldCheckPoint = ssStatus.dwCheckPoint;
//等待指定的间隔。
Sleep(ssStatus.dwWaitHint);
//再次检查状态。
if(!QueryServiceStatus(
schService, //处理服务
&ssStatus) ) //状态信息的地址
break;
//如果检查点未增加,则中断。
if (dwOldCheckPoint >= ssStatus.dwCheckPoint)
break;
}
if (ssStatus.dwCurrentState == SERVICE_RUNNING)
printf("StartService SUCCESS\n");
其他
{
printf("\nService not started: \n");
printf(“当前状态:%d \\ n”,
ssStatus.dwCurrentState);
printf(" Exit Code: %d\n", ssStatus.dwWin32ExitCode);
printf(“服务特定退出代码:%d \\ n”,
ssStatus.dwServiceSpecificExitCode);
printf(" Check Point: %d\n", ssStatus.dwCheckPoint);
printf(" Wait Hint: %d\n", ssStatus.dwWaitHint);
}
CloseServiceHandle(schService);
}