Я звоню в 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 ()?