2010-06-05 12 views
5

का उपयोग कर मैं CreateProcessAsUser उपयोग कर रहा हूँ सी # में एक सेवा मेरी सेवा से बाहर निकलने के प्रक्रिया के लिए इंतजार करने की जरूरत है द्वारा एक प्रक्रिया शुरू करने के लिए, लेकिन मैं कैसे मैं यह कर सकता पता नहीं है बाहर निकलने के लिए, मैं प्रक्रिया सूची में प्रक्रिया अस्तित्व की जांच करना नहीं चाहताइंतजार जब CreateProcessAsUser

+0

मैंने एक उदाहरण जोड़ा कि प्रक्रिया संभाल कैसे लपेटा जा सकता है। –

उत्तर

3

चेक http://www.pinvoke.net/ लपेट होता है। यहाँ एक शिम उदाहरण है।

const UInt32 INFINITE = 0xFFFFFFFF; 

// Declare variables 
PROCESS_INFORMATION pi; 
STARTUPINFO si; 
System.IntPtr hToken; 

// Create structs 
SECURITY_ATTRIBUTES saThreadAttributes = new SECURITY_ATTRIBUTES();  

// Now create the process as the user 
if (!CreateProcessAsUser(hToken, String.Empty, commandLine, 
null, saThreadAttributes, false, 0, IntPtr.Zero, 0, si, pi)) 
{ 
// Throw exception 
throw new Exception("Failed to CreateProcessAsUser"); 
} 

WaitForSingleObject(pi.hProcess, (int)INFINITE); 
0

आप GetExitCodeProcess का उपयोग कर सकते हैं, लेकिन ध्यान दें कि यह फ़ंक्शन तुरंत लौटाता है।

एक और दृष्टिकोण WaitForSingleObject का उपयोग कर रहा है। लेकिन इस प्रक्रिया को SYNCHRONIZE ध्वज के साथ खोलने की आवश्यकता है। उदाहरण:

IntPtr hwnd = OpenProcess(SYNCHRONIZE, 0, pid); 
if (hwnd != IntPtr.Zero) { 
    WaitForSingleObject(hwnd, INFINITE); 
    CloseHandle(hwnd); 
} 
0

CreateProcessAsUser रिटर्न आप एक संरचना PROCESS_INFORMATION, जो hProcess शामिल हैं - प्रक्रिया संभाल। यह WaitForSingleObject/WaitForMultipleObjects फ़ंक्शंस के लिए मान्य संभाल है।

MSDN: WaitForSingleObject, WaitForMultipleObjects

7

PROCESS_INFORMATION रिटर्न नव निर्मित प्रक्रिया (hProcess) को संभाल, तो आप इस संभाल जो संकेत हो जाएगा जब प्रक्रिया रास्ते पर इंतजार कर सकते हैं।

आप SafeWaitHandle का उपयोग संभाल को समाहित कर सकते हैं और फिर WaitHandle.WaitOne का उपयोग प्रक्रिया से बाहर निकलने के लिए प्रतीक्षा करने के लिए कर सकते हैं।

का तरीका यहां बताया प्रक्रिया को संभालने

class ProcessWaitHandle : WaitHandle 
{ 
    public ProcessWaitHandle(IntPtr processHandle) 
    { 
    this.SafeWaitHandle = new SafeWaitHandle(processHandle, false); 
    } 
} 

और फिर निम्न कोड हस्ताक्षर के लिए बाहर हैंडल पर इंतजार कर सकते हैं

ProcessWaitHandle waitable = new ProcessWaitHandle(pi.hProcess); 
waitable.WaitOne(); 
संबंधित मुद्दे