Как запустить службу средствами Win API

Как запустить службу средствами Win API

Есть такая задача запустить службу очереди печати, запустить ее надо средствами win api, это вообще реально сделать?

А то я напрямую пытаюсь прописать ключ реестра в ветке HKEY_LOCAL_MACHINE,«SYSTEM\CurrentControlSet\Services\Spooler» у меня ничего не получается.

У меня 4 ошибки в коде, не получается запустить службу. Вот код, как думайте что может быть?

#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
        "Sample_Srv",          // имя службы
        SERVICE_ALL_ACCESS);

    if (schService == NULL) 
    { 
        return 0; 
    }

    if (!StartService(
            schService,  // дескриптор службы 
            0,           // число параметров 
            NULL) )      // параметров нет
    {
        return 0; 
    }
    else 
    {
        printf("Service start pending.\n"); 
    }

    // Проверяем состояние до тех пор, пока служба больше не ожидает запуска.

    if (!QueryServiceStatusEx( 
            schService,             // дескриптор службы 
            SC_STATUS_PROCESS_INFO, // уровень информации
            &ssStatus               // адрес структуры с информацией о статусе
            sizeof(STATUS_PROCESS_INFO), 
            &dwBytesNeeded ) )      // если слишком маленький буфер
    {
        return 0; 
    }

    // Сохраним подсчет импульсов сигнала времени и первоначальную контрольную точку.

    dwStartTickCount = GetTickCount();
    dwOldCheckPoint = ssStatus.dwCheckPoint;

    while (ssStatus.dwCurrentState == SERVICE_START_PENDING) 
    { 
        // Не ждите дольше чем указано ожидать. Хороший интервал - 
        // одна десятая от указанного времени ожидания, но никакая меньше чем 1 секунда 
        // и никак не больше, чем 10 секунд.

        dwWaitTime = ssStatus.dwWaitHint / 10;

        if( dwWaitTime < 1000 )
            dwWaitTime = 1000;
        else if ( dwWaitTime > 10000 )
            dwWaitTime = 10000;

        Sleep( dwWaitTime );

        // Проверьте состояние снова.

    if (!QueryServiceStatusEx( 
            schService,             // дескриптор службы 
            SC_STATUS_PROCESS_INFO, // уровень информации
            &ssStatus               // адрес структуры с информацией о статусе
            sizeof(STATUS_PROCESS_INFO), 
            &dwBytesNeeded ) )      // если слишком маленький буфер
            break;

        if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
        {
            // Служба создает индикацию протекания процесса.

            dwStartTickCount = GetTickCount();
            dwOldCheckPoint = ssStatus.dwCheckPoint;
        }
        else
        {
            if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
            {
                // В рамках ожидания указания индикацию протекания процесса не делать.
                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;
    } 
}

Среда разработки DEV C++ вот ошибки.

 C:\Documents and Settings\Admin\Рабочий стол\Untitled1.cpp In function `BOOL StartSampleService(SC_HANDLE__*)': 
41 C:\Documents and Settings\Admin\Рабочий стол\Untitled1.cpp expected `)' before "sizeof" 
42 C:\Documents and Settings\Admin\Рабочий стол\Untitled1.cpp cannot convert `SERVICE_STATUS_PROCESS*' to `BYTE*' for argument `3' to `BOOL QueryServiceStatusEx(SC_HANDLE__*, SC_STATUS_TYPE, BYTE*, DWORD, DWORD*)' 
73 C:\Documents and Settings\Admin\Рабочий стол\Untitled1.cpp expected `)' before "sizeof" 
74 C:\Documents and Settings\Admin\Рабочий стол\Untitled1.cpp cannot convert `SERVICE_STATUS_PROCESS*' to `BYTE*' for argument `3' to `BOOL QueryServiceStatusEx(SC_HANDLE__*, SC_STATUS_TYPE, BYTE*, DWORD, DWORD*)'

В 41-й и 74-й строках пропущена запятая между аргументами функции (после &ssStatus):

&ssStatus // адрес структуры с информацией о статусе
sizeof(STATUS_PROCESS_INFO), 

Попробуйте исправить это и запустить компиляцию. Винды сейчас нет под рукой, к сожалению.

Исправил, теперь стало две ошибки.

C:\Documents and Settings\Admin\Рабочий стол\Project1.cpp In function `BOOL StartSampleService(SC_HANDLE__*)': 41
C:\Documents and Settings\Admin\Рабочий стол\Project1.cpp `STATUS_PROCESS_INFO' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.)

В чем может быть дело?

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.