Не получается создать службу виндовс

172
30 декабря 2019, 08:50

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

Код создания сервиса:

    void WINAPI ServiceMain(DWORD argc, LPTSTR argv[]){
        hService = RegisterServiceCtrlHandlerEx(ServiceName, HandlerEx, NULL);
        ssServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
        ssServiceStatus.dwCurrentState = SERVICE_RUNNING;
        ssServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | 
    SERVICE_ACCEPT_SHUTDOWN;
       ssServiceStatus.dwWin32ExitCode = 0;
       ssServiceStatus.dwServiceSpecificExitCode = 0;
       ssServiceStatus.dwCheckPoint = 0;
       ssServiceStatus.dwWaitHint = 0;
       SetServiceStatus(hService, &ssServiceStatus);

       while (!bServiceStopFlag)
       {
           //cout << ("Wait client\n");
           *md.DocName = { 0 };
           *md.Author = { 0 };
           *md.id = { 0 };
           DWORD  dwThreadId = 0;
           //while (true) {
           HANDLE pipe =
               CreateNamedPipeA(
                   pipename,
                   PIPE_ACCESS_DUPLEX,
                   PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
                   PIPE_UNLIMITED_INSTANCES,
                   512,
                   512,
                   5000,
                   NULL);
           if (pipe == INVALID_HANDLE_VALUE)
           {
               cout << ("CreateNamedPipe failed, GLE=%d.\n", GetLastError());
               return ;
           }
           if (ConnectNamedPipe(pipe, NULL))
           {
               cout << ("Client connected\n");
               HANDLE thread;
               thread = CreateThread(
                   NULL,              // no security attribute 
                   0,                 // default stack size 
                   InstanceThread,    // thread proc
                   (LPVOID)pipe,    // thread parameter 
                   0,                 // not suspended 
                   &dwThreadId);      // returns thread ID 
               if (thread == NULL)
               {
                   cout << ("CreateThread failed, GLE=%d.\n", GetLastError());
                   return ;
               }
               else CloseHandle(thread);
           }
           else
               CloseHandle(pipe);
           //}
       }
       Sleep(1000);
       ssServiceStatus.dwCurrentState = SERVICE_STOPPED;
       SetServiceStatus(hService, &ssServiceStatus);}
   DWORD WINAPI HandlerEx(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
{
    switch (dwControl)
    {
    case SERVICE_CONTROL_SHUTDOWN:
    case SERVICE_CONTROL_STOP:
        ssServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
        ssServiceStatus.dwCheckPoint = 0;
        ssServiceStatus.dwWaitHint = 80000;
        SetServiceStatus(hService, &ssServiceStatus);
        bServiceStopFlag = true;
        break;
    case SERVICE_CONTROL_INTERROGATE:
        SetServiceStatus(hService, &ssServiceStatus);
        break;
    }
    return 1;
}

Я не понимаю, что именно я делаю не правильно в создании сервиса?

READ ALSO
Использование new

Использование new

В нескольких примерах на просторах сети можно найти следующие вещиДопустим имеем несколько определений:

165
Задача на С++ олимпиадная

Задача на С++ олимпиадная

Вокруг ведущего стоит N человек, которые пронумерованы по часовой стрелку числами от 1 до NВедущий, начиная с первого отсчитывает M человек...

164
Как вывести определенную часть файла?

Как вывести определенную часть файла?

Пишу несложную базу данных (использую простоtxt файлы) на c++ Вот так выглядят данные в файле

206
QWebEnginePage findText всегда false

QWebEnginePage findText всегда false

Не могу разобраться почему у меня не работает findText в QWebEnginePage, я точно знаю что текст на странице есть, а он пишет false:

146