Aracılığıyla paylaş


Hizmet Başlatma

Hizmet veya sürücü hizmetini başlatmak için hizmet denetim programı startserviceişlevini kullanır. Veritabanı kilitliyse StartService işlevi başarısız olur. Bu durumda, hizmet denetim programı birkaç saniye beklemeli ve startservice yeniden çağırmalıdır. QueryServiceLockStatus işlevini çağırarak veritabanının geçerli kilit durumunu denetleyebilir.

Hizmet denetim programı bir hizmeti başlatıyorsa, hizmetin ServiceMain işlevine geçirilecek bir dizi bağımsız değişken belirtmek için StartService işlevini kullanabilir. StartService işlevi, ServiceMain işlevini yürütmek için yeni bir iş parçacığı oluşturulduktan sonra döndürür. Hizmet denetimi programı, QueryServiceStatus işlevini çağırarak yeni başlatılan hizmetin durumunu SERVICE_STATUS bir yapıda alabilir. Başlatma sırasında dwCurrentState üyesi SERVICE_START_PENDING olmalıdır. dwWaitHint üyesi, QueryServiceStatus yeniden çağırmadan önce hizmet denetim programının ne kadar beklemesi gerektiğini gösteren milisaniye cinsinden bir zaman aralığıdır. Başlatma tamamlandığında, hizmet dwCurrentState SERVICE_RUNNING olarak değişir.

Hizmet denetim yöneticisi, özel ortam değişkenlerinin başlangıçta bir hizmete geçirilmesini desteklemez. Ayrıca hizmet denetim yöneticisi, hizmet çalışırken ortam değişkenlerini algılamaz ve değişiklikleri iletmez. Bir hizmeti ortam değişkenine bağımlı hale getirmek yerine kayıt defteri değerlerini veya ServiceMain bağımsız değişkenlerini kullanın.

Aşağıda, hizmet denetim yöneticisi tarafından tipik bir hizmet başlatıldığında neler olduğuna ilişkin basitleştirilmiş bir genel bakış verilmiştir:

  • SCM, hizmet yolunu kayıt defterinden okur ve hizmeti başlatmaya hazırlanır. Buna hizmet kilidinin alınması dahildir. Hizmet kilidi tutulurken başka bir hizmet başlatma girişimi, hizmet kilidi serbest bırakılana kadar engellenir.
  • SCM işlemi başlatır ve alt işlemden çıkana (hata olduğunu gösteren) veya SERVICE_RUNNING durumunu bildirene kadar bekler.
  • Uygulama çok basit başlatma gerçekleştirir ve StartServiceCtrlDispatcher işlevini çağırır.
  • StartServiceCtrlDispatcher hizmet denetim yöneticisine bağlanır ve hizmet için ServiceMain işlevini çağıran ikinci bir iş parçacığı başlatır. ServiceMain en kısa zamanda SERVICE_RUNNING bildirmelidir.
  • Hizmet denetim yöneticisine hizmetin çalıştığı bildirildiğinde hizmet kilidini serbest bırakır.

Hizmet 80 saniye içinde durumunu ve son bekleme ipucunu güncelleştirmezse, hizmet denetim yöneticisi hizmetin yanıt vermeyi durdurduğunu belirler. Hizmet denetim yöneticisi bir olayı günlüğe kaydeder ve hizmeti durdurur.

Program bir sürücü hizmeti başlatıyorsa, StartService, cihaz sürücüsünün başlatılması tamamlandıktan sonra geri döner.

Daha fazla bilgi için bkz. Hizmet başlatma.