Создание службы Windows без Visual Studio - PullRequest
8 голосов
/ 03 сентября 2008

Так что создание службы Windows с использованием Visual Studio довольно тривиально. Мой вопрос немного глубже в отношении того, что на самом деле делает исполняемый файл устанавливаемым как сервис, и как написать сервис как простое приложение на Си. Я не смог найти много ссылок на это, но я предполагаю, что должен быть какой-то интерфейс, который я мог бы реализовать, чтобы мой .exe мог быть установлен как служба.

Ответы [ 4 ]

3 голосов
/ 04 сентября 2008

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

Важно, что ваша программа должна вызывать StartServiceCtrlDispatcher () при запуске. Это подключает вашу службу к диспетчеру управления службами и устанавливает подпрограмму ServiceMain, которая является главной точкой входа ваших служб.

ServiceMain (вы можете называть его как угодно, но на самом деле он всегда ServiceMain) должен затем вызвать RegisterServiceCtrlHandlerEx (), чтобы определить процедуру обратного вызова, чтобы ОС могла уведомлять вашу службу при возникновении определенных событий.

Вот некоторые фрагменты из службы, которую я написал несколько лет назад:

настроен как сервис:

SERVICE_TABLE_ENTRY ServiceStartTable[] =
{
   { "ServiceName", ServiceMain },
   { 0, 0 }
};

if (!StartServiceCtrlDispatcher(ServiceStartTable))
{
   DWORD err = GetLastError();
   if (err == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
      return false;
}

ServiceMain:

void WINAPI ServiceMain(DWORD, LPTSTR*)
{
    hServiceStatus = RegisterServiceCtrlHandlerEx("ServiceName", ServiceHandlerProc, 0);

сервисный обработчик:

DWORD WINAPI ServiceHandlerProc(DWORD ControlCode, DWORD, void*, void*)
{
    switch (ControlCode)
    {
    case SERVICE_CONTROL_INTERROGATE :
        // update OS about our status
    case SERVICE_CONTROL_STOP :
        // shut down service
    }

    return 0;
}
1 голос
/ 28 июля 2009

Я знаю, что немного опоздал на вечеринку, но недавно у меня возник тот же вопрос, и мне пришлось пробираться сквозь паутину в поисках ответов.

Мне удалось найти эту статью в MSDN, которая фактически закладывает основы. В итоге я соединил многие файлы здесь в один exe-файл, содержащий все необходимые мне команды, и добавил в свой собственный метод void run (), который зацикливается на весь срок службы сервиса для моих собственных нужд. *

Это было бы отличным началом для кого-то другого именно с этим вопросом, так что для будущих искателей, проверьте его:

Полный образец обслуживания http://msdn.microsoft.com/en-us/library/bb540476(VS.85).aspx

1 голос
/ 03 сентября 2008

В основном вам нужно установить некоторые параметры реестра, а также некоторые интерфейсы для реализации.

Проверьте это: http://msdn.microsoft.com/en-us/library/ms685141.aspx

Вы заинтересованы в SCM (Service Control Manager).

1 голос
/ 03 сентября 2008

Надеюсь, это поможет:

http://support.microsoft.com/kb/251192

Казалось бы, вам просто нужно запустить этот exe-файл для исполняемого двоичного файла, чтобы зарегистрировать его в качестве службы.

...