前面blog说过windows(7及以后)中,服务和进程位于不同的session,如何查询服务状态,这里贴出代码
TCHAR szSvcName[] = TEXT("SSIT_Client_Service");
SC_HANDLE schSCManager;
SC_HANDLE schService;
SERVICE_STATUS_PROCESS ssStatus;
DWORD dwOldCheckPoint;
DWORD dwStartTickCount;
DWORD dwWaitTime;
DWORD dwBytesNeeded;
// Get a handle to the SCM database.
schSCManager = OpenSCManager(
NULL, // local computer
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
if (NULL == schSCManager)
{
printf("OpenSCManager failed (%d)\n", GetLastError());
}
// Get a handle to the service.
schService = OpenService(
schSCManager, // SCM database
szSvcName, // name of service
SERVICE_QUERY_STATUS |
SERVICE_ENUMERATE_DEPENDENTS
); // full access
if (schService == NULL)
{
CloseServiceHandle(schSCManager);
}
else
{
// Check the status in case the service is not stopped.
if (!QueryServiceStatusEx(
schService, // handle to service
SC_STATUS_PROCESS_INFO, // information level
(LPBYTE)&ssStatus, // address of structure
sizeof(SERVICE_STATUS_PROCESS), // size of structure
&dwBytesNeeded)) // size needed if buffer is too small
{
printf("QueryServiceStatusEx failed (%d)\n", GetLastError());
}
else
{
// Check if the service is already running. It would be possible
// to stop the service here, but for simplicity this example just returns.
switch (ssStatus.dwCurrentState)
{
case SERVICE_STOPPED:
case SERVICE_STOP_PENDING:
break;
case SERVICE_PAUSED:
case SERVICE_PAUSE_PENDING:
break;
case SERVICE_CONTINUE_PENDING:
case SERVICE_RUNNING:
case SERVICE_START_PENDING:
break;
}
}
}
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);