Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 03.04.2019
Сообщений: 30

Не получается собрать шаблон WindowsService C++

20.03.2020, 14:22. Показов 1768. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые.
Несколько дней нахожусь в поиске шаблона Windows Service, со встроенным инсталятором. Ни один собрать не могу.
Остановился на том, который представляю данным постом. Имел при сборке его кучу ошибок (ворнинги вообще не считаю).
Как мог поправлял. Застопорился, гуглил по заголовкам для wcscat_s, что не подсовывал - все равно эта проблема.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
src/main.cpp: In function 'void ServiceCtrlHandler(DWORD)':
src/main.cpp:201:7: warning: variable 'success' set but not used [-Wunused-but-set-variable]
  BOOL success;
       ^~~~~~~
src/main.cpp: In function 'void ServiceInstall()':
src/main.cpp:283:2: error: 'wcscat_s' was not declared in this scope
  wcscat_s(szPath, MAX_PATH + 9, _T(" -service"));
  ^~~~~~~~
src/main.cpp:283:2: note: suggested alternative: 'wcscat'
  wcscat_s(szPath, MAX_PATH + 9, _T(" -service"));
  ^~~~~~~~
  wcscat
src/main.cpp:294:33: error: cannot convert 'TCHAR*' {aka 'char*'} to 'LPCWSTR' {aka 'const wchar_t*'}
           SERVICE_ERROR_NORMAL, szPath,
                                 ^~~~~~
In file included from c:\mingw\include\windows.h:53,
                 from src/main.cpp:7:
Также прилагаю свой Makefile
Code
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
CC      := gcc
C_FLAGS := -std=c++17 -Wall -Wextra -g -fpermissive
 
BIN     := bin
SRC     := src
INCLUDE := include
LIB     := lib
 
LIBRARIES   :=
 
ifeq ($(OS),Windows_NT)
EXECUTABLE  := TemplateWindowsService.exe
else
EXECUTABLE  := TemplateWindowsService
endif
 
all: $(BIN)/$(EXECUTABLE)
 
clean:
    $(RM) $(BIN)/$(EXECUTABLE)
 
run: all
    ./$(BIN)/$(EXECUTABLE)
 
$(BIN)/$(EXECUTABLE): $(SRC)/*.cpp
    $(CC) $(C_FLAGS) -I$(INCLUDE) -L$(LIB) $^ -o $@ $(LIBRARIES)

Может кто-нибудь знающий глянуть когд и показать, как исправить проблему?
Ниже весь листинг main.cpp
Спасибо.
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
#include <tchar.h>
#ifndef UNICODE
#define UNICODE
#define UNICODE_WAS_UNDEFINED
#endif
 
#include <Windows.h>
 
#ifdef UNICODE_WAS_UNDEFINED
#undef UNICODE
#endif
#include <iostream>
 
using namespace std;
 
void ServiceInstall();
void ServiceUnInstall();
void ServiceStart();
void ServiceStop();
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceCtrlHandler(DWORD nControlCode);
int WINAPI StartServiceThread();
int WINAPI UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
                        DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,
                        DWORD dwWaitHint);
DWORD WINAPI ServiceExecutionThread(LPDWORD param);
void KillService();
void PrintError(const char ErrorTest[]);
 
wchar_t *strServiceName = L"FTPServer";
SERVICE_STATUS_HANDLE nServiceStatusHandle;
HANDLE killServiceEvent;
BOOL nServiceRunning;
DWORD nServiceCurrentStatus;
HANDLE hServiceThread;
 
int _tmain(int argc, wchar_t *argv[])
{
    char HelpString[56] = "Usage: ftp_server.exe -[start|stop|install|uninstall]\r\n";
    if (argc == 2)
    {
        if (argv[1][0] == L'-')
        {
            if (wcscmp(argv[argc - 1], L"service") == 0)
            {
                SERVICE_TABLE_ENTRY servicetable[] =
                    {
                        {strServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain},
                        {NULL, NULL}};
                if (!StartServiceCtrlDispatcher(servicetable))
                {
                    PrintError("");
                }
                return 0;
            }
            if (wcscmp(argv[argc - 1], L"start") == 0)
            {
                ServiceStart();
                return 0;
            }
            if (wcscmp(argv[argc - 1], L"stop") == 0)
            {
                ServiceStop();
                return 0;
            }
            if (wcscmp(argv[argc - 1], L"install") == 0)
            {
                ServiceInstall();
                return 0;
            }
            if (wcscmp(argv[argc - 1], L"uninstall") == 0)
            {
                ServiceUnInstall();
                return 0;
            }
            if (wcscmp(argv[argc - 1], L"console") == 0)
            {
                //StartServiceThread();
                return 0;
            }
        }
        else
        {
            cout << HelpString;
            return 0;
        }
    }
    else
    {
        cout << HelpString;
        return 0;
    }
}
 
void ServiceMain(DWORD argc, LPTSTR *argv)
{
    nServiceStatusHandle = RegisterServiceCtrlHandler(strServiceName,
                                                      (LPHANDLER_FUNCTION)ServiceCtrlHandler);
    if (!nServiceStatusHandle)
    {
        return;
    }
    if (!UpdateServiceStatus(SERVICE_START_PENDING, NO_ERROR, 0, 1, 3000))
    {
        return;
    }
    killServiceEvent = CreateEvent(0, TRUE, FALSE, 0);
    if (killServiceEvent == NULL)
    {
        return;
    }
    if (!UpdateServiceStatus(SERVICE_START_PENDING, NO_ERROR, 0, 2, 1000))
    {
        return;
    }
    nServiceCurrentStatus = SERVICE_RUNNING;
    if (!UpdateServiceStatus(SERVICE_RUNNING, NO_ERROR, 0, 0, 0))
    {
        return;
    }
    if (!StartServiceThread())
    {
        UpdateServiceStatus(SERVICE_STOPPED, NO_ERROR, 0, 0, 0);
        return;
    }
    WaitForSingleObject(killServiceEvent, INFINITE);
    CloseHandle(killServiceEvent);
}
 
int UpdateServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode,
                        DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,
                        DWORD dwWaitHint)
{
    SERVICE_STATUS nServiceStatus;
    nServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    nServiceStatus.dwCurrentState = dwCurrentState;
    if (dwCurrentState == SERVICE_START_PENDING)
    {
        nServiceStatus.dwControlsAccepted = 0;
    }
    else
    {
        nServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
    }
    if (dwServiceSpecificExitCode == 0)
    {
        nServiceStatus.dwWin32ExitCode = dwWin32ExitCode;
    }
    else
    {
        nServiceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
    }
    nServiceStatus.dwServiceSpecificExitCode = dwServiceSpecificExitCode;
    nServiceStatus.dwCheckPoint = dwCheckPoint;
    nServiceStatus.dwWaitHint = dwWaitHint;
 
    if (!SetServiceStatus(nServiceStatusHandle, &nServiceStatus))
    {
        KillService();
        return false;
    }
    else
        return true;
}
 
int StartServiceThread()
{
    DWORD id;
    hServiceThread = CreateThread(0, 0,
                                  (LPTHREAD_START_ROUTINE)ServiceExecutionThread,
                                  0, 0, &id);
    if (hServiceThread == 0)
    {
        return false;
    }
    else
    {
        nServiceRunning = true;
        return true;
    }
}
 
DWORD ServiceExecutionThread(LPDWORD param)
{
    while (nServiceRunning)
    {
        Sleep(4000);
    }
    return 0;
}
 
void KillService()
{
    nServiceRunning = false;
    SetEvent(killServiceEvent);
    UpdateServiceStatus(SERVICE_STOPPED, NO_ERROR, 0, 0, 0);
}
 
void ServiceCtrlHandler(DWORD nControlCode)
{
    BOOL success;
    switch (nControlCode)
    {
    case SERVICE_CONTROL_SHUTDOWN:
    case SERVICE_CONTROL_STOP:
        nServiceCurrentStatus = SERVICE_STOP_PENDING;
        success = UpdateServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 0, 1, 3000);
        KillService();
        return;
    default:
        break;
    }
    UpdateServiceStatus(nServiceCurrentStatus, NO_ERROR, 0, 0, 0);
}
 
void ServiceStart()
{
    SC_HANDLE schService;
    SC_HANDLE schSCManager;
    char tCantStart[] = "Cannot start service (%d)";
 
    schSCManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
    if (!schSCManager)
    {
        PrintError(tCantStart);
        return;
    }
    schService = OpenService(schSCManager, strServiceName, SERVICE_START);
    if (!schService)
    {
        PrintError(tCantStart);
        CloseServiceHandle(schSCManager);
        return;
    }
    if (!StartService(schService, 0, NULL))
    {
        PrintError(tCantStart);
    }
 
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
}
 
void ServiceStop()
{
    SC_HANDLE schService;
    SC_HANDLE schSCManager;
    char tCantStop[] = "Cannot stop service (%d)";
 
    schSCManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
    if (!schSCManager)
    {
        PrintError(tCantStop);
        return;
    }
    schService = OpenService(schSCManager, strServiceName, SERVICE_STOP);
    if (!schService)
    {
        PrintError(tCantStop);
        CloseServiceHandle(schSCManager);
        return;
    }
    SERVICE_STATUS m_SERVICE_STATUS;
    if (!ControlService(schService, SERVICE_CONTROL_STOP, &m_SERVICE_STATUS))
        PrintError(tCantStop);
 
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
}
 
void ServiceInstall()
{
    SC_HANDLE schSCManager;
    SC_HANDLE schService;
    TCHAR szPath[MAX_PATH + 9];
    char tCantInst[] = "Cannot install service (%d)";
 
    if (!GetModuleFileName(NULL, szPath, MAX_PATH))
    {
        PrintError(tCantInst);
        return;
    }
    wcscat_s(szPath, MAX_PATH + 9, _T(" -service"));
 
    schSCManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
    if (!schSCManager)
    {
        PrintError(tCantInst);
        return;
    }
 
    schService = CreateService(schSCManager, strServiceName, L"FTP server",
                               SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,
                               SERVICE_ERROR_NORMAL, szPath,
                               0, 0, 0, 0, 0);
    if (!schService)
    {
        PrintError(tCantInst);
        CloseServiceHandle(schSCManager);
        return;
    }
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
}
 
void ServiceUnInstall()
{
    SC_HANDLE schService;
    SC_HANDLE schSCManager;
    char tCantUnInst[] = "Cannot uninstall service (%d)";
 
    schSCManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
    if (!schSCManager)
    {
        PrintError(tCantUnInst);
        return;
    }
    schService = OpenService(schSCManager, strServiceName, DELETE);
    if (!schService)
    {
        PrintError(tCantUnInst);
        CloseServiceHandle(schSCManager);
        return;
    }
    if (!DeleteService(schService))
    {
        PrintError(tCantUnInst);
    }
 
    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
}
 
void PrintError(const char ErrorTest[])
{
    DWORD dw = GetLastError();
    switch (dw)
    {
    case ERROR_ACCESS_DENIED:
        cout << "Access is denied. You do not have access rights.\n";
        break;
    case ERROR_SERVICE_EXISTS:
        cout << "The specified service already exists.\n";
        break;
    case ERROR_SERVICE_ALREADY_RUNNING:
        cout << "An instance of the service is already running.\n";
        break;
    case ERROR_SERVICE_NOT_ACTIVE:
        cout << "The service has not been started.\n";
        break;
    case ERROR_SERVICE_DOES_NOT_EXIST:
        cout << "The specified service does not exist as an installed service.\n";
        break;
    case ERROR_SERVICE_MARKED_FOR_DELETE:
        cout << "The specified service has been marked for deletion.\n";
        break;
    case ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
        cout << "The service process could not connect to the service controller.\n";
        cout << "Use the '-start' to start the service.\n";
        break;
    default:
        if (ErrorTest[0] != '\0')
            printf(ErrorTest, dw);
        else
            printf("Error %d\n", dw);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.03.2020, 14:22
Ответы с готовыми решениями:

WCF + WindowsService
В общем есть задача написать небольшой проект, к которому в дальнейшем будет обращаться два-три других web-приложения. Явно напрашивается...

WindowsService для ведения логов
Добрый день.. у меня вот такая проблема я написал сервис который должен писать лог через домустим минуту. вот текст программы: using...

Автономное воспроизведение видео в WindowsService
Встала необходимость в автономном воспроизведении Видео. Задумка такова: Считывание информации из XML, и воспроизведение по времени. Все...

24
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.03.2020, 10:47
Студворк — интернет-сервис помощи студентам
DrHamlet, а если обозвать её WinMain?
0
0 / 0 / 0
Регистрация: 03.04.2019
Сообщений: 30
25.03.2020, 11:51  [ТС]
Croessmah,
Code
1
2
3
4
5
src/main.cpp:49:5: error: conflicting declaration of C function 'int WinMain(int, wchar_t**)'
 int WinMain(int argc, wchar_t *argv[]) {
     ^~~~~~~
In file included from c:\mingw\include\windows.h:44,
                 from src/main.cpp:8:
тут суть в чем получается (насколько я понимаю): макрос _tmain заменит int _tmain() на int wmain() в случае использования юникода, или на int main() в случае, когда не будет указано использовать юникод.
я чего докопался к _tmain с его wmain: пытаюсь заставить работать int wmain(int argc, wchar_t *argv[]) именно с wchar_t (в сэмплах от майкрософ очень часто используется wchar_t, мне это на данный момент важно в образовательных целях, заставить работать сэмпл, а потом экспериментировать. как говорится, нихрена не понятно, но очень интересно).
В итоге выходит, что mingw32 тупо отказывается использовать юникод в винсборках.
А вот майкрософтовый компилятор спокойно использует юникод.

PS: ребят, может знаете как в VS Code использовать компилятор MSVC, вместо MinGW? Чет никак не нагуглю
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
25.03.2020, 11:53
Цитата Сообщение от DrHamlet Посмотреть сообщение
PS: ребят, может знаете как в VS Code использовать компилятор MSVC, вместо MinGW? Чет никак не нагуглю
Используй Visual Studio 2019. Зачем тебе vs code?
0
0 / 0 / 0
Регистрация: 03.04.2019
Сообщений: 30
25.03.2020, 11:57  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Используй Visual Studio 2019. Зачем тебе vs code?
более привычная среда, тк микроконтроллеры программирую из VS Code + PlatformIO.
Так-то, конечно, не принципиально. Просто пожелание.
PS: стоило задать вопрос на форуме, так сразу нагуглил по вопросу использования компилятора MSVC в VSCode, может кому пригодится https://code.visualstudio.com/docs/cpp/config-msvc
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.03.2020, 12:01
Кстати, вот https://stackoverflow.com/ques... codeblocks
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.03.2020, 12:01

Необходимо собрать готовую развёртку (шаблон с функциями) для OpenCart 3
Добрый день! Нам требуется мастер OpenCart 3, который может очень качественно сделать сборку для развёртывания интернет-магазина. Для...

Не получается собрать программу
Здравствуйте ! Использую &quot;Geany&quot; в ОС &quot;Linuxmint 17&quot; Столкнулся с такой проблемой, пытаюсь создать класс в двух отдельных файлах...

Не получается собрать проект
Не могу собрать проект по теме &quot;Qt-руководство для начинающих&quot;.Пункт 2.2. Выводит 2 ошибки: cannot open output file...

Не получается собрать объект
Всем привет Есть таблица.В ней есть 2 поля со встроенными в ячейки &lt;input type (цена и дата) и поле с чекбоксами (для каждой строки свой...

Не получается собрать apk
Всем привет. не получается собрать апк (на симуляторе все нормально работает). тип сборки-релиз, целевой цпу установлен any cpu.


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru