функція startservice
[In] Дескриптор служби. Цей дескриптор повертається функцією OpenService або CreateService. і він повинен мати право доступу SERVICE_START. Додаткову інформацію дивись в статті Захист служби і права доступу.
[In] Число рядків в масиві lpServiceArgVectors. Якщо lpServiceArgVectors має значення ПУСТО (NULL), цей параметр може бути нулем.
[In] Покажчик на масив покажчиків на рядки з завершальним нулем, який передається службі як параметри. Служби драйвера не отримують ці параметри. Якщо ніякі параметри не передаються службі, цей параметр може бути значенням ПУСТО (NULL). Служба звертається до цих параметрів через свою функцію ServiceMain. Перший параметр (argv [0]) - це ім'я служби за замовчуванням, супроводжуваний параметрами, якщо такі взагалі є, в масиві lpServiceArgVectors.
Якщо функція завершується успішно, повертається значення є ненульовим.
Якщо функція завершується помилкою, яке значення - нуль. Щоб отримати додаткову інформацію про помилку, викличте GetLastError.
Наступні коди помилки можуть бути встановлені диспетчером управління службами. Інші можуть встановитися функціями реєстру, які викликає диспетчер управління службами.
Процес для служби був запущений, але він не викликав функцію StartServiceCtrlDispatcher. або потік, який викликав StartServiceCtrlDispatcher міг бути блокований функцією обробної програми управління.
Коли запускається сервісний драйвер, функція StartService не повертає значення до тих пір, поки драйвер пристрою не закінчить ініціалізацію.
Коли служба запускається, Диспетчер управління службами (SCM). в разі необхідності, породжує процес служби. Якщо зазначена служба спільно використовує процес з іншими службами, необхідний процес може вже існувати. Функція StartService не чекає першого поновлення стану від нової служби, тому що це може зажадати часу. Замість цього вона повертає значення, коли Диспетчер управління службами (SCM) отримує повідомлення від диспетчера управління службою, що потік ServiceMain для цієї служби створено успішно.
Диспетчер управління службами (SCM) встановлює за замовчуванням таке значення стану перед поверненням значення з функції StartService.
- Поточний стан служби встановлюється в SERVICE_START_PENDING.
- Прийняті засоби управління нікуди не встановлюються (нуль).
- Значення CheckPoint встановлюється в нуль.
- Час WaitHint встановлюється в 2 секунди.
Зухвалий процес може визначити, закінчила нова служба свою ініціалізацію, періодично викликаючи функцію QueryServiceStatus. щоб зробити запит про стан служби.
Служба не може викликати StartService в ході ініціалізації. Причина в тому, що Диспетчер управління службами (SCM) в ході ініціалізації блокує базу даних управління службою, таким чином виклик StartService блокується. Як тільки служба повідомляє Диспетчер управління службами (SCM). що вона успішно запустилася, служба може викликати StartService.
Як і ControlService. функція StartService буде блокуватися протягом 30 секунд, якщо будь-яка служба зайнята обробкою керуючого коду. Якщо зайнята служба все ще не повернулася зі свого обробника функції, коли перерва закінчується, функція StartService завершується помилкою ERROR_SERVICE_REQUEST_TIMEOUT. Це відбувається тому, що Диспетчер управління службами (SCM) одночасно обробляє тільки одне керуюче повідомлення служби.