2010-04-07 14 views
17

बनाना मैं दो खिड़कियां आवेदन है, एक एक खिड़कियों सेवा है जो EventWaitHandle बना सकते हैं और इसके लिए इंतजार है। दूसरा एप्लिकेशन एक विंडोज़ गुई है जो इसे EventWaitHandle.OpenExisting() पर कॉल करके खोलता है और ईवेंट सेट करने का प्रयास करता है। लेकिन मुझे OpenExisting में अपवाद मिल रहा है। अपवाद है "पथ तक पहुंच अस्वीकार कर दी गई है"।एक क्रॉस-प्रोसेस EventWaitHandle

खिड़कियों सेवा कोड

EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName"); 
wh.WaitOne(); 

विंडोज जीयूआई कोड

try 
{ 
    EventWaitHandle wh = EventWaitHandle.OpenExisting("MyEventName"); 
    wh.Set(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

मैं दो नमूना सांत्वना आवेदन के साथ एक ही कोड की कोशिश की, यह ठीक काम कर रहा था।

उत्तर

30

आपको EventWaitHandle constructor के संस्करण का उपयोग करने की आवश्यकता है जो EventWaitHandleSecurity उदाहरण लेता है। , इसके अलावा

// create a rule that allows anybody in the "Users" group to synchronise with us 
var users = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null); 
var rule = new EventWaitHandleAccessRule(users, EventWaitHandleRights.Synchronize | EventWaitHandleRights.Modify, 
          AccessControlType.Allow); 
var security = new EventWaitHandleSecurity(); 
security.AddAccessRule(rule); 

bool created; 
var wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName", out created, security); 
... 

यदि आप Vista पर चल रहे हैं या बाद में, आप ग्लोबल नेम स्पेस में घटना बनाने के लिए की जरूरत है: उदाहरण के लिए, निम्नलिखित कोड काम करना चाहिए (यह परीक्षण नहीं किया है, लेकिन उम्मीद है कि आप आरंभ होगा) (यानी, "ग्लोबल \" के साथ नाम उपसर्ग करें)। यदि आप "फास्ट यूजर स्विचिंग" सुविधा का उपयोग करते हैं तो आपको इसे विंडोज एक्सपी पर भी करना होगा।

+1

धन्यवाद। मुझे पहले परीक्षण करने दो .... – Navaneeth

+0

अरे आपको बहुत धन्यवाद ..... इसके कामकाजी ठीक – Navaneeth

+0

आह ... वैश्विक उपसर्ग। मैं हमेशा इसे भूल जाता हूँ। –

0

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

Windows प्रारंभ मेनू से झंडा "व्यवस्थापक के रूप में चलाएँ" के साथ जीयूआई एप्लिकेशन चलाने की कोशिश करें। यदि यह समस्या हल करता है, तो आपको अपने कोड के भीतर ऊंचाई का अनुरोध करने के तरीके को पढ़ने की आवश्यकता है। (मैंने ऐसा नहीं किया है)

+0

मैं केवल व्यवस्थापक के रूप में लॉग-इन और मैं खिड़कियों का उपयोग कर रहा XP – Navaneeth

+0

अच्छा सोच है, लेकिन मैं रन नहीं लगता कि प्रशासक के रूप में के बाद से अन्य प्रक्रिया एक अलग सत्र में चल रहा है में मदद मिलेगी है। उदाहरण के लिए, मुझे विश्वास नहीं है कि म्यूटेक्स को "सत्र 0" में एक सेवा के बीच साझा किया जा सकता है और इंटरैक्टिव सत्र पर लॉग ऑन किया जा सकता है। हालांकि मैं इस संबंध में कोई विशेषज्ञ नहीं हूं। – Josh

+1

बस निम्न दस्तावेज़ मिला जो Vista में सत्र 0 प्रभाव का वर्णन करता है। जैसा कि कोडेका का उल्लेख है, यदि आप स्पष्ट रूप से ग्लोबल \ स्कोप का उपयोग करते हैं तो आप ईवेंट को इस तरह से साझा कर सकते हैं। URL यह रहा: http://www.microsoft.com/whdc/system/sysinternals/Session0Changes.mspx – Josh

संबंधित मुद्दे