C создать и запустить windows сервис - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь создать службу, которая будет запускаться при запуске системы, и запустить ее немедленно. Сервис должен запускать мой exe-файл. Функция GetLastError возвращает код ошибки 1053.

int main(void)
{
    SC_HANDLE SC_manager_handle;
    SC_HANDLE service_handle;
    LPCTSTR binary_path = "C:\\Users\\User\\AppData\\file.exe";
    LPCTSTR display_name = "ExampleService";
    LPCTSTR service_name = "EXAMPLE_SERVICE";

    SC_manager_handle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

    puts("-----------------------");
    if(SC_manager_handle == NULL)
        puts("Open SM Manager: FAILED");
    else
        puts("SC Manager: SUCCESS");
    
    service_handle = CreateService(SC_manager_handle, service_name, display_name, SERVICE_ALL_ACCESS ,SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, binary_path, NULL, NULL, NULL, NULL, NULL);

    if(service_handle == NULL)
        puts("Create Service: FAILED");
    else
        puts("Service Create: SUCCESS");

    // running the exe file immediately
    if(!StartService(service_handle, 0, NULL))
        printf("Start Service: FAILED | ERROR: %d\n", GetLastError());
    else
        puts("Service Start: SUCCESS");

    CloseServiceHandle(SC_manager_handle);
    CloseServiceHandle(service_handle);

    return 0;
}

1 Ответ

0 голосов
/ 07 августа 2020

Я думаю, вы упускаете некоторые важные требования для службы windows. Согласно MSDN .

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

Итак, вы можете обратиться к коду , чтобы узнать, как написать ServiceMain функцию и установить ее.

Если вы хотите открыть службу в соответствии с Starting a Service:

Чтобы запустить службу, программа управления службами открывает дескриптор установленной базы данных, а затем указывает дескриптор в вызове функции StartService. После запуска службы программа использует элементы структуры SERVICE_STATUS_PROCESS, возвращаемые функцией QueryServiceStatusEx, для отслеживания прогресса службы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...