Member 12330615 Ответов: 1

Как превратить консольную программу Windows на программы службы Windows?


В моем VC++ я закончил писать код консоли windows. Но теперь я должен преобразовать его в служебный код windows.

Поэтому я изменил некоторый код в этой консольной программе следующим образом

#include <winsvc.h>

int main()
{
    SERVICE_TABLE_ENTRY ste[] = {
       {_T("TEST Win"}, (LPSERVICE_MAIN_FUNCTION) MyTestWindows},
    };

    StartServiceCtrlDisplatcher(ste);

    return 0;
}

и в MyTestWindows () я закодировал следующим образом.

void MyTestWindows()
{
    g_hSrv = RegisterServiceCtrlHandler(_T("TestWin"),
                        LPHANDLER_FUNCTION)MyServiceHandler);
    if (g_hSrv == 0) return;

    MyServiceSet(SERVICE_START_PENDING);
    g_bPause = FALSE;

    g_ExitEvent = CreateEvent(NULL, TRUE, FALSE, _T("TESTWINSTATUS");

    MyServiceSet(SERVICE_RUNNING);

    // This is same of windows console program...

    MyServiceSet(SERVICE_STOPPED);
    return;
}


Но когда я запускаю эту программу, ни один поток или служба windows не работают. Он молчит....?
Пожалуйста, дайте мне знать, в чем заключается моя вина в этом кодировании и решении.

Заранее спасибо.

Что я уже пробовал:

Еще 2 дня потрачено впустую на эту проблему.

Suvendu Shekhar Giri

Есть успехи с отладкой?

1 Ответов

Рейтинг:
0

Jochen Arndt

Вы не показали нам создание и функцию рабочего потока, а также MyServiceSet и MyServiceHandler реализации. Таким образом, мы не можем найти проблемы внутри этой функции.

MyServiceSet(SERVICE_RUNNING);
 
// This is same of windows console program...
 
MyServiceSet(SERVICE_STOPPED);
Услуги, как правило, создает, а не какой-нить там :
MyServiceSet(SERVICE_RUNNING);
HANDLE hThread = CreateThread (NULL, 0, ServiceWorkerThread, NULL, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
MyServiceSet(SERVICE_STOPPED);
DWORD WINAPI ServiceWorkerThread(LPVOID lpParam)
{
    while (WaitForSingleObject(g_ExitEvent, SOME_TIMEOUT) != WAIT_OBJECT_0)
    {
        // Code from your console program
    }
    return 0;
}
g_ExitEvent должно быть установлено MyServiceHandler на SERVICE_CONTROL_STOP.

Наконец, просто чтобы быть уверенным: вы установили свой сервис?


Member 12330615

- Вы установили свою службу?"
Мне очень жаль, что я не понимаю смысла этого вопроса....

Jochen Arndt

Служба должна быть установлена, прежде чем ее можно будет использовать.
Видеть Введение в приложения-Службы Windows
и
Как создать службу Windows с помощью Sc.exe