Einzelnen Beitrag anzeigen

Blutiger Anfänger
(Gast)

n/a Beiträge
 
#2

Re: Dienst automatisch starten

  Alt 22. Aug 2004, 01:06
Rate doch mal. Wenn das Programm den Dienst installieren kann, kann es ihn auch starten:

ms-help://MS.PSDK.1033/dllproc/base/starting_a_service.htm

Code:
DWORD StartSampleService()

    SERVICE_STATUS ssStatus;
    DWORD dwOldCheckPoint;
    DWORD dwStartTickCount;
    DWORD dwWaitTime;
    DWORD dwStatus;
 
    schService = OpenService( 
        schSCManager,         // SCM database
        "Sample_Srv",         // service name
        SERVICE_ALL_ACCESS);
 
    if (schService == NULL)
    { 
        MyErrorExit("OpenService");
    }
 
    if (!StartService(
            schService, // handle to service
            0,          // number of arguments
            NULL) )     // no arguments
    {
        MyErrorExit("StartService");
    }
    else
    {
        printf("Service start pending.\n");
    }
 
    // Check the status until the service is no longer start pending.
 
    if (!QueryServiceStatus( 
            schService,  // handle to service
            &ssStatus) ) // address of status information structure
    {
        MyErrorExit("QueryServiceStatus");
    }
 
    // 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 (!QueryServiceStatus( 
                schService,  // handle to service
                &ssStatus) ) // address of structure
            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;
            }
        }
    } 

    if (ssStatus.dwCurrentState == SERVICE_RUNNING)
    {
        printf("StartService SUCCESS.\n");
        dwStatus = NO_ERROR;
    }
    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);
        dwStatus = GetLastError();
    } 
 
    CloseServiceHandle(schService);
    return dwStatus;
}
  Mit Zitat antworten Zitat