Получить дескриптор статуса сервиса после инициализации сервиса - PullRequest
1 голос
/ 05 декабря 2011

Я звоню в Win32 API из .Net 1.1, чтобы запросить дополнительное время запуска для службы (.Net 2.0 и выше в настоящее время не поддерживается).Вот псевдокод, который я вызываю в методе OnStart ().

private void OnStart(){
    private IntPtr statusHandle;
    private IntPtr serviceHandle;
    private IntPtr serviceControlManagerHandle;

    serviceControlManagerHandle = ServiceUtil.OpenSCManager(null, null, (uint)ServiceUtil.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
    serviceHandle = ServiceUtil.OpenService(serviceControlManagerHandle, this.ServiceName, (uint)ServiceUtil.SERVICE_ACCESS.SERVICE_ALL_ACCESS);

    //This fills the empty object with VALID data
    SERVICE_STATUS status = ServiceUtil.QueryServiceStatus(serviceHandle, ref status)

    //This returns a VALID pointer.
    statusHandle = ServiceUtil.RegisterServiceCtrlHandler(this.ServiceName, serviceHandle);
}

Эта часть прекрасно работает.Я получаю действительные (не IntPtr.Zero) дескрипторы для каждого, и я могу обновить SERVICE_STATUS просто отлично.Однако мне ДЕЙСТВИТЕЛЬНО нужно, чтобы этот код был в методе Init () (я модернизирую устаревшую службу, которая работает по тайм-ауту).Но когда я перемещаю этот код в метод Init (), я могу получить действительный дескриптор диспетчера управления службами и саму службу, но НЕ статус службы.Мой полученный, НЕ РАБОТАЮЩИЙ, код выглядит следующим образом ...

private void MyServiceClass(){
    InitializeComponent();

    private IntPtr statusHandle;
    private IntPtr serviceHandle;
    private IntPtr serviceControlManagerHandle;

    serviceControlManagerHandle = ServiceUtil.OpenSCManager(null, null, (uint)ServiceUtil.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
    serviceHandle = ServiceUtil.OpenService(serviceControlManagerHandle, this.ServiceName, (uint)ServiceUtil.SERVICE_ACCESS.SERVICE_ALL_ACCESS);
    statusHandle = ServiceUtil.RegisterServiceCtrlHandler(this.ServiceName, serviceHandle);

    //This fills the empty object with VALID data
    SERVICE_STATUS status = ServiceUtil.QueryServiceStatus(serviceHandle, ref status)

    //This returns an INVALID pointer.
    statusHandle = ServiceUtil.RegisterServiceCtrlHandler(this.ServiceName, serviceHandle);
}

В обоих случаях QueryServiceStatus заполняет «status» действительными значениями.Однако только первый пример устанавливает «statusHandle» в качестве допустимого указателя.Как получить действительный дескриптор структуры статуса службы перед входом в метод OnStart ()?

1 Ответ

0 голосов
/ 08 декабря 2011

Если функция RegisterServiceCtrlHandlerEx , которая, скорее всего, вызывается методом ServiceUtil.RegisterServiceCtrlHandler, завершится ошибкой , она вернет пустой указатель .

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

Чего именно вы пытаетесь достичь? Мы могли бы найти другое решение.

...