Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bir hizmet denetim programı yeni bir hizmetin çalıştırılmasını istediğinde, Hizmet Denetim Yöneticisi (SCM) hizmeti başlatır ve denetim dağıtıcısına bir başlatma isteği gönderir. Denetim dağıtıcısı, hizmet için ServiceMain işlevini yürütmek için yeni bir iş parçacığı oluşturur. Örnek için bkz. ServiceMain İşlevi Yazma.
ServiceMain işlevi aşağıdaki görevleri gerçekleştirmelidir:
Tüm genel değişkenleri başlatın.
Hizmet için denetim isteklerini işlemek üzere bir İşleyicisi işlevi kaydetmek için RegisterServiceCtrlHandler işlevini hemen çağırın. RegisterServiceCtrlHandler dönüş değeri, hizmet durumunu SCM'ye bildirmek için çağrılarda kullanılacak hizmet durumu tanıtıcısı.
Başlatmayı gerçekleştirin. Başlatma kodunun yürütme süresinin çok kısa olması bekleniyorsa (bir saniyeden kısa), başlatma doğrudan ServiceMainiçinde gerçekleştirilebilir.
Başlatma süresinin bir saniyeden uzun olması bekleniyorsa, hizmet aşağıdaki başlatma tekniklerinden birini kullanmalıdır:
SERVICE_RUNNING raporlamak için SetServiceStatus işlevini çağırın, ancak başlatma tamamlanana kadar hiçbir denetim kabul etme. Hizmet bunu, dwCurrentState SERVICE_RUNNING olarak ayarlanmış SetServiceStatus çağırarak yapar ve SERVICE_STATUS yapısında dwControlsAccepted 0 olarak ayarlanır. Bu, SCM'nin hazır olmadan önce hizmete herhangi bir denetim isteği göndermemesini sağlar ve SCM'yi diğer hizmetleri yönetmek üzere serbest bırakın. Bu başlatma yaklaşımı, özellikle otomatik başlangıç hizmetleri için performans açısından önerilir.
Rapor SERVICE_START_PENDING, denetim kabul etme ve bir bekleme ipucu belirtme. Hizmetinizin başlatma kodu ilk bekleme ipucu değerinden daha uzun sürmesi beklenen görevleri gerçekleştiriyorsa, ilerlemenin kaydedildiğini belirtmek için kodunuzun düzenli aralıklarla SetServiceStatus işlevini çağırması gerekir (büyük olasılıkla düzeltilmiş bir bekleme ipucuyla). Yalnızca başlatma işlemi ilerleme kaydediyorsa SetServiceStatus çağırın. Aksi takdirde SCM, hizmetinizin ilerleme kaydettiğini varsayarak hizmetinizin SERVICE_RUNNING durumuna girmesini bekleyebilir ve diğer hizmetlerin başlatılmasını engelleyebilir. Başlatmayı gerçekleştiren iş parçacığının gerçekten ilerleme kaydettiğinden emin değilseniz setservicestatus ayrı bir iş parçacığından çağırmayın.
Bu yaklaşımı kullanan bir hizmet ayrıca bir denetim noktası değeri belirtebilir ve uzun bir başlatma sırasında değeri düzenli aralıklarla artırabilir. Hizmeti başlatan program QueryServiceStatus veya QueryServiceStatusEx çağırarak SCM'den en son denetim noktası değerini alabilir ve değerini kullanarak kullanıcıya artımlı ilerleme durumunu bildirebilir.
Başlatma tamamlandığında, hizmet durumunu SERVICE_RUNNING olarak ayarlamak ve hizmetin kabul etmeye hazır olduğu denetimleri belirtmek için SetServiceStatusçağırın. Denetimlerin listesi için SERVICE_STATUS yapısına bakın.
Hizmet görevlerini gerçekleştirin veya bekleyen görev yoksa denetimi çağırana döndürebilirsiniz. Hizmet durumundaki herhangi bir değişiklik, yeni durum bilgilerini bildirmek için SetServiceStatusçağrısı gerektirir.
Hizmet başlatılırken veya çalışırken bir hata oluşursa, hizmet durumunu temizlemenin uzun olması durumunda SERVICE_STOP_PENDING olarak ayarlamak için hizmet SetServiceStatus çağırmalıdır. Temizleme tamamlandıktan sonra, hizmet durumunu sonlandıracak son iş parçacığından SERVICE_STOPPED olarak ayarlamak için SetServiceStatus çağırın. Hatayı tanımlamak için dwServiceSpecificExitCode ve dwWin32ExitCode SERVICE_STATUS yapısının üyelerini.
İlgili konular