2011-05-25 2 views
14

को पुनरारंभ करें मुझे पता है कि यह सी #/नेट में किया जा सकता है लेकिन मैं सोच रहा था कि यह विंडोज एपीआई को कॉल कर सकता है या नहीं?प्रोग्रामेटिक रूप से एक विंडोज सेवा

मेरे पास एक सेवा है जो सेवा डीएचसीपी अनुरोधों की सेवा करेगी, जब मैं सेवा को रोकने के लिए सेवा की कॉन्फ़िगरेशन अपडेट करना चाहता हूं, इसकी आईएनआई फ़ाइल को फिर से लिखना और फिर सेवा शुरू करना चाहता हूं।

किसी भी मदद की सराहना की!

उत्तर

25
  1. ओपन OpenSCManager साथ सेवा नियंत्रण प्रबंधक।
  2. उस सेवा को खोलें जिसे आप OpenService से नियंत्रित करना चाहते हैं।
  3. सेवा को रोकने के लिए SERVICE_CONTROL_STOP पैरामीटर के साथ ControlService या ControlServiceEx का उपयोग करें।
  4. जो कुछ भी आपको करना है वह करें।
  5. सेवा को पुनरारंभ करने के लिए StartService का उपयोग करें।
  6. सेवा और एससीएम हैंडल को बंद करने के लिए CloseServiceHandle का उपयोग करें।
2

एक डॉस बॉक्स में, net start [service] आपको जो चाहिए वह करेगा। यदि आपको एपीआई समाधान नहीं मिला है, तो आप पैरामीटर के रूप में start [service] का उपयोग करके net.exe के लिए हमेशा एक प्रक्रिया शुरू कर सकते हैं।

3

आपको सेवा नियंत्रण प्रबंधक (OpenSCManager) खोलने की आवश्यकता होगी, फिर सेवा को स्वयं खोलें (OpenService) और अंत में इसे स्वयं शुरू करने के लिए कहें (StartService)। जिस तरह से आप उपयोग करते हैं, सभी हैंडल बंद करें, फिर आप कर लेंगे।

वाह, सी ++ में सेवाओं से निपटने वास्तव में मुझे वापस ले जाता है ...

गुड लक,

2

आप इसके लिए use WMI भी कर सकते हैं। उस लिंक पर नमूना कोड वीबी है, लेकिन यह विंडोज पर किसी भी भाषा के लिए बंदरगाह के लिए बहुत आसान होना चाहिए।

यदि आप विंडोज़ पर स्वचालन में हैं, तो डब्ल्यूएमआई सीखना अच्छा है क्योंकि यह सिस्टम पर अधिकांश रोचक वस्तुओं के लिए एक भाषा-तटस्थ ऑब्जेक्ट उन्मुख इंटरफ़ेस प्रदान करता है।

2

मुझे पार्टी के लिए देर हो चुकी है, लेकिन मैं सेवा शुरू करने और रोकने दोनों के लिए आधिकारिक विस्तृत उदाहरण सुझाऊंगा। अन्य उत्तर यहाँ पर लाभ यह है कि वे त्रुटि हैंडलिंग, धार मामलों और निर्भर सेवाओं में शामिल है -

बंद करो: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686335(v=vs.85).aspx प्रारंभ: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686315(v=vs.85).aspx

2

कभी-कभी आप सेवा से ही सेवा को पुनः आरंभ करना चाहते हैं। यह समाधान मेरे लिए काम किया। मैंने स्पष्टता के लिए बल्कि मामूली टाइमर कोड छोड़ा। ध्यान दें कि यह समाधान केवल इसलिए काम करता है क्योंकि कॉलर एक सेवा है और एक उच्च स्तर पर चलता है।

void Watchdog::OnTimeout() 
{ 
    STARTUPINFO si = { }; 
    si.cb = sizeof(STARTUPINFO); 
    GetStartupInfo(&si); 

    PROCESS_INFORMATION pi = { }; 

    // is modified by the call to CreateProcess (unicode version). 
    TCHAR szCmdLine[] = _T("cmd.exe /C \"net stop <yourservicenamehere> & net start <yourservicenamehere>\""); 

    // send shell command to restart our service. 
    if (!CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) 
    { 
     // do some error reporting... 
     LOG("*** ERROR *** Watchdog timeout. Restart attempt failed. Last error: 0x%x\n", GetLastError()); 
    } 
}