Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633

Сервис. StartService

06.04.2022, 05:38. Показов 3100. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! НЕ знаю почему, но на этой функции StartService() вылетает ошибка и всё тут, ошибка возвращаемая GetLastError() = 2. Код такой.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <windows.h>
#include <iostream>
 
using std::cout;
using std::cin;
using std::endl;
 
int main()
{
    char  service_name[] = "DemoService";    // имя сервиса
    //char  service_name[] = "D:\\MyFolder\\Документы\\__Projects\\1\\Ex33_1\\Debug\\Ex33_1.exe";    // имя сервиса
    const char* param[] = { "p1", "p2", "p3" };   // список параметров
    SC_HANDLE  hServiceControlManager, hService;
 
    // связываемся с менеджером сервисов
    hServiceControlManager = OpenSCManager(
        NULL,    // локальная машина
        NULL,    // активная база данных сервисов
        SC_MANAGER_CONNECT   // соединение с менеджером сервисов
    );
    if (hServiceControlManager == NULL)
    {
        cout << "Open service control manager failed." << endl
            << "The last error code: " << GetLastError() << endl
            << "Press any key to continue." << endl;
        cin.get();
 
        return 0;
    }
 
    cout << "Service control manager is opened." << endl
        << "Press any key to continue." << endl;
    cin.get();
 
    // открываем сервис
    hService = OpenServiceA(
        hServiceControlManager,  // дескриптор менеджера сервисов
        service_name,            // имя сервиса
        SERVICE_ALL_ACCESS       // полный доступ к сервису
    );
    if (hService == NULL)
    {
        cout << "Open service failed." << endl
            << "The last error code: " << GetLastError() << endl
            << "Press any key to exit." << endl;
        cin.get();
 
        // закрываем дескриптор менеджера сервисов
        CloseServiceHandle(hServiceControlManager);
 
        return 0;
    }
 
    cout << "Service is opened." << endl
        << "Press any key to continue." << endl;
    cin.get();
 
    // стартуем сервис
    if (!StartServiceA(
        hService,    // дескриптор сервиса
        0,           // три параметра
        /*(const char**)param*/ 0 // указатель на массив параметров
    ))
    {
        cout << "Start service failed." << endl
            << "The last error code: " << GetLastError() << endl
            << "Press any key to exit." << endl;
        cin.get();
 
        // закрываем дескрипторы
        CloseServiceHandle(hServiceControlManager);
        CloseServiceHandle(hService);
 
        return 0;
    }
 
    cout << "The service is started." << endl
        << "Press any key to exit." << endl;
    cin.get();
 
    // закрываем дескрипторы
    CloseServiceHandle(hServiceControlManager);
    CloseServiceHandle(hService);
 
    return 0;
}


И ещё...
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <windows.h>
#include <fstream>
 
using std::ofstream;
using std::endl;
 
char  service_name[] = "DemoService";    // имя сервиса
 
SERVICE_STATUS    service_status;
SERVICE_STATUS_HANDLE  hServiceStatus;
 
VOID WINAPI ServiceMain(DWORD dwArgc, LPSTR* lpszArgv);
VOID WINAPI ServiceCtrlHandler(DWORD dwControl);
 
ofstream  out;   // выходной файл для протокола работы сервиса
int  nCount;     // счетчик
    
    // главная функция приложения
int main(int argc, char* argv[])
{
    //  инициализируем структуру сервисов
    SERVICE_TABLE_ENTRYA  service_table[] =
    {
      {service_name, ServiceMain},   // имя сервиса и функция сервиса
      { NULL, NULL }                 // больше сервисов нет
    };
 
    // запускаем диспетчер сервиса
    if (!StartServiceCtrlDispatcherA(service_table))
    {
        out.open("D:\\ServiceFile.log");
        out << "Start service control dispatcher failed.";
        out.close();
 
        return 0;
    }
 
    return 0;
}
 
VOID WINAPI ServiceMain(DWORD dwArgc, LPSTR* lpszArgv)
{
    // регистрируем обработчик управляющих команд для сервиса
    hServiceStatus = RegisterServiceCtrlHandlerA(
        service_name,        // имя сервиса
        ServiceCtrlHandler   // обработчик управляющих команд
    );
    if (!hServiceStatus)
    {
        out.open("D:\\ServiceFile.log");
        out << "Register service control handler failed.";
        out.close();
 
        return;
    }
 
    // инициализируем структуру состояния сервиса
    service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    service_status.dwCurrentState = SERVICE_START_PENDING;
    service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP |
        SERVICE_ACCEPT_SHUTDOWN;
    service_status.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
    service_status.dwServiceSpecificExitCode = 0;
    service_status.dwCheckPoint = 0;
    service_status.dwWaitHint = 5000;
 
    // устанавливаем состояние сервиса
    if (!SetServiceStatus(hServiceStatus, &service_status))
    {
        out.open("D:\\ServiceFile.log");
        out << "Set service status 'SERVICE_START_PENDING' failed.";
        out.close();
 
        return;
    }
 
    // определяем сервис как работающий 
    service_status.dwCurrentState = SERVICE_RUNNING;
    // нет ошибок
    service_status.dwWin32ExitCode = NO_ERROR;
    // устанавливаем новое состояние сервиса
    if (!SetServiceStatus(hServiceStatus, &service_status))
    {
        out.open("D:\\ServiceFile.log");
        out << "Set service status 'START_PENDING' failed.";
        out.close();
        return;
    }
 
    // открываем файл протокола работы сервиса
    out.open("D:\\ServiceFile.log");
    out << "The service is started." << endl;
    out << "My name is: " << lpszArgv[0] << endl;
    for (int i = 1; i < (int)dwArgc; ++i)
        out << "My " << i << " parameter =  " << lpszArgv[i] << endl;
 
    // рабочий цикл сервиса
    while (service_status.dwCurrentState == SERVICE_RUNNING)
    {
        ++nCount;
        Sleep(3000);
    }
}
 
VOID WINAPI ServiceCtrlHandler(DWORD dwControl)
{
    switch (dwControl)
    {
    case SERVICE_CONTROL_STOP:     // остановить сервис
      // записываем конечное значение счетчика
        out << "Count = " << nCount << endl;
        out << "The service is finished." << endl;
        // закрываем файл
        out.close();
 
        // устанавливаем состояние остановки
        service_status.dwCurrentState = SERVICE_STOPPED;
        // изменить состояние сервиса
        SetServiceStatus(hServiceStatus, &service_status);
        break;
 
    case SERVICE_CONTROL_SHUTDOWN:     // завершить сервис
        service_status.dwCurrentState = SERVICE_STOPPED;
        // изменить состояние сервиса
        SetServiceStatus(hServiceStatus, &service_status);
        break;
 
    default:
        // увеличиваем значение контрольной точки
        ++service_status.dwCheckPoint;
        // оставляем состояние сервиса без изменения
        SetServiceStatus(hServiceStatus, &service_status);
        break;
    }
 
    return;
}

Подскажите, что не так?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.04.2022, 05:38
Ответы с готовыми решениями:

StartService не запускает драйвер
Здравствуйте! Где косяк непойму, код примерно таков: SC_HANDLE schManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); ...

StartService возвращает ERROR_INVALID_HANDLE
Пытаюсь написать драйвер с помощью Windows Driver Kit 8. Создаю в Visual Studio 2012 Ultimate стандартный проект &quot;KMDF Driver&quot;....

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

23
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
11.04.2022, 09:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Замабувараев Посмотреть сообщение
Апи лишь дёргает Диспетчер Служб
как-то упустил из виду этот ответ, который в корень неверный.
диспетчер служб дергает api, а не наоборот.
посмотрите импорт sc.exe - advapi32!StartServiceW

постараюсь на этой неделе сделать небольшой блог, в котором объясню что такое api
смотрю у многих начинающих (и не только) программистов полная абстракция и непонимание что это такое и как это работает.
1
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
11.04.2022, 16:18
Цитата Сообщение от _lunar_ Посмотреть сообщение
на этой неделе сделать небольшой блог, в котором объясню что такое api
старался доходчивом языком объяснить, чтобы все смогли понять Стек вызовов Windows API
2
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
11.04.2022, 17:52
Цитата Сообщение от _lunar_ Посмотреть сообщение
как-то упустил из виду этот ответ, который в корень неверный.
диспетчер служб дергает api, а не наоборот.
посмотрите импорт sc.exe - advapi32!StartServiceW
Но ведь sc — это не диспетчер служб.
sc лишь утилита, которая дёргает АПИ диспетчера служб.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
11.04.2022, 21:29
Цитата Сообщение от Замабувараев Посмотреть сообщение
АПИ диспетчера служб
диспетчер служб это тоже утилита (приложение) - services.exe
у него нет API, он использует API.
ещё раз: API это набор функций, расположенных в библиотеках DLL (это не те функции, которые мы пишем в Visual Studio).
эти функции выполняют заложенный в них код в тот момент, когда программист использовал эту функцию из хидера и собрал исполняемый файл.

есть приложение (*.exe) -> у него нет API -> приложение использует API из таких библиотек как ntdll.dll, kernel32.dll, user32.dll и других.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2022, 21:29
Помогаю со студенческими работами здесь

Сервис для уведомлений. Ошибка на небольшом кол-ве клиентов. Сервис слишком занят, чтобы обработать запрос
Уже несколько дней не могу разобраться в чём причина. Код проекта для тестирования прилагаю. Конфигурация serviceThrottling настроена, но...

Связка Сервис Контейнер - Сервис провайдер - Фасад
Здравствуйте всем Я сам начинающий в ларавель (соскочил с Yii2) и пытаюсь разобраться в базовых архитектурных принципов во фреймворке. ...

Духовка BOSCH HBA 73A 550 /01 нужен сервис мануал, Похоже демо , не могу снять ,нужно как зайти в сервис
Не включает не один ТЭН , свет вентиляторы работают ,несколько дохлых реле заменил

Сервис
у меня есть приложение, которое делает скрин монитора и отправляет подключенным к нему компам Но проблема стоит в следующем когда я...

C# и сервис no-ip
Пишу сервер клиент приложение столкнулся с проблемой что изза NAT у меня оно не работает через интернет (в локалке все нормально...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru