Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631

Сервис. StartService

06.04.2022, 05:38. Показов 3036. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru