Starting a Service
来源:互联网 发布:金山软件 编辑:程序博客网 时间:2024/05/23 02:07
Starting a Service
To start a service, the following example opens a handle to an installed database and then specifies the handle in a call to the StartService function. It can be used to start either a service or a driver service, but this example assumes that a service is being started. After starting the service, the program uses the members of the SERVICE_STATUS_PROCESS structure returned by the QueryServiceStatusEx function to track the progress of the service.
The function requires a handle to a service control manager database. For more information, see Opening an SCManager Database.
#include <windows.h>#include <stdio.h>BOOL StartSampleService(SC_HANDLE schSCManager) { SC_HANDLE schService; SERVICE_STATUS_PROCESS ssStatus; DWORD dwOldCheckPoint; DWORD dwStartTickCount; DWORD dwWaitTime; DWORD dwBytesNeeded; schService = OpenService( schSCManager, // SCM database "Sample_Srv", // service name SERVICE_ALL_ACCESS); if (schService == NULL) { return 0; } if (!StartService( schService, // handle to service 0, // number of arguments NULL) ) // no arguments { return 0; } else { printf("Service start pending./n"); } // Check the status until the service is no longer start pending. if (!QueryServiceStatusEx( schService, // handle to service SC_STATUS_PROCESS_INFO, // info level &ssStatus, // address of structure sizeof(SERVICE_STATUS_PROCESS), // size of structure &dwBytesNeeded ) ) // if buffer too small { return 0; } // Save the tick count and initial checkpoint. dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint; while (ssStatus.dwCurrentState == SERVICE_START_PENDING) { // Do not wait longer than the wait hint. A good interval is // one tenth the wait hint, but no less than 1 second and no // more than 10 seconds. dwWaitTime = ssStatus.dwWaitHint / 10; if( dwWaitTime < 1000 ) dwWaitTime = 1000; else if ( dwWaitTime > 10000 ) dwWaitTime = 10000; Sleep( dwWaitTime ); // Check the status again. if (!QueryServiceStatusEx( schService, // handle to service SC_STATUS_PROCESS_INFO, // info level &ssStatus, // address of structure sizeof(SERVICE_STATUS_PROCESS), // size of structure &dwBytesNeeded ) ) // if buffer too small break; if ( ssStatus.dwCheckPoint > dwOldCheckPoint ) { // The service is making progress. dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint; } else { if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint) { // No progress made within the wait hint break; } } } CloseServiceHandle(schService); if (ssStatus.dwCurrentState == SERVICE_RUNNING) { printf("StartService SUCCESS./n"); return 1; } else { printf("/nService not started. /n"); printf(" Current State: %d/n", ssStatus.dwCurrentState); printf(" Exit Code: %d/n", ssStatus.dwWin32ExitCode); printf(" Service Specific Exit Code: %d/n", ssStatus.dwServiceSpecificExitCode); printf(" Check Point: %d/n", ssStatus.dwCheckPoint); printf(" Wait Hint: %d/n", ssStatus.dwWaitHint); return 0; } }
- Starting a Service
- Starting Tomcat as a Service on Linux
- Starting Tomcat as a Service on Linux
- Starting MySQL as a Windows Service
- cygrunsrv: Error starting a service: QueryServiceStatus: Win32 error 1062: 解决办法
- cygrunsrv: Error starting a service: QueryServiceStatus: Win32 error 1062: 解决办法
- cygrunsrv: Error starting a service: QueryServiceStatus: Win32 error 1062: 解决办法
- cygrunsrv: Error starting a service: QueryServiceStatus: Win32 error 1062
- Error starting a service: StartService: Win32 error 1069:
- Beginning configuration step: Starting Server Starting MySQL as a service 解决方案
- A new starting point
- It's a starting
- A new starting ...
- Starting From A Decision.
- a starting sample of paint
- Starting a process from KernelMode
- Starting a process from KernelMode
- Starting a Process from KernelMode
- Installing a Service
- Deleting a Service
- Changing a Service Configuration
- 给中国学生的第三封信:成功、自信、快乐(李开复)--转载
- Querying a Service's Configuration
- Starting a Service
- Stopping a Service
- Sending Control Requests to a Service
- Modifying the DACL for a Service
- 给中国学生的第二封信(李开复)--转载
- ChangeServiceConfig
- ChangeServiceConfig2
- CloseServiceHandle
- ControlService