Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1804322
  • 博文数量: 290
  • 博客积分: 10653
  • 博客等级: 上将
  • 技术积分: 3178
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-24 23:08
文章存档

2013年(6)

2012年(15)

2011年(25)

2010年(86)

2009年(52)

2008年(66)

2007年(40)

分类: C/C++

2009-07-02 19:55:51

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 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 structure returned by the function to track the progress of the service.

The function requires a handle to a service control manager database. For more information, see .

 

#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;
    }
}

阅读(679) | 评论(0) | 转发(0) |
0

上一篇:_spawnvpe

下一篇:Stopping a Service

给主人留下些什么吧!~~