ऐसा लगता है कि विंडोज 7 (बाद में विंडोज सर्वर 2012 आर 2 के साथ नवीनतम अनुभव से) विंडोज संस्करणों पर, सेवा नियंत्रण प्रबंधक (एससीएम) अधिक सख्त है।
जबकि विंडोज 7 पर यह सिर्फ एक अन्य प्रक्रिया को जन्म देता है, अब यह जाँच रहा है कि क्या सेवा प्रक्रिया अभी भी आस-पास है और ERROR_SERVICE_MARKED_FOR_DELETE (1072) किसी भी बाद के कॉल के लिए CreateService / DeleteService को लौटा सकती है, भले ही सेवा बंद हो जाए।
मैं यहां विंडोज एपीआई कोड की बात कर रहा हूं, लेकिन मैं स्पष्ट रूप से रेखांकित करना चाहता हूं कि क्या हो रहा है, इसलिए इस अनुक्रम में उल्लिखित त्रुटि हो सकती है:
SC_HANDLE hScm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);
SC_HANDLE hSvc = OpenService(hScm, L"Stub service", SERVICE_STOP | SERVICE_QUERY_STATUS | DELETE);
SERVICE_STATUS ss;
ControlService(hSvc, SERVICE_CONTROL_STOP, &ss);
// ... wait for service to report its SERVICE_STOPPED state
DeleteService(hSvc);
CloseServiceHandle(hSvc);
hSvc = nullptr;
// any further calls to CreateService/DeleteService will fail
// if service process is still around
किसी सेवा प्रक्रिया के बाद भी इसका कारण यह है कि इसकी पहले से ही रिपोर्ट की गई अपनी SERVICE_STOPPED स्थिति आश्चर्यजनक नहीं है। यह एक नियमित प्रक्रिया है, जिसका मुख्य धागा StartServiceCtrlDispatcherएपीआई के लिए इसकी कॉल में 'अटक' जाता है, इसलिए यह पहले स्टॉप कंट्रोल एक्शन पर प्रतिक्रिया करता है, लेकिन फिर इसके शेष कोड अनुक्रम को निष्पादित करना पड़ता है।
यह दुर्भाग्यपूर्ण है कि SCM / OS हमारे लिए इसे ठीक से नहीं संभाल रहा है। एक प्रोग्रामेटिक समाधान थोड़े सरल और सटीक है: सेवा को रोकने से पहले सेवा निष्पादन योग्य प्रक्रिया को प्राप्त करें, फिर इस हैंडल के सिग्नल होने का इंतजार करें।
यदि सिस्टम प्रशासन के दृष्टिकोण से समस्या आ रही है, तो समाधान पूरी तरह से गायब होने के लिए सेवा प्रक्रिया की प्रतीक्षा करना है।