2010-01-29 21 views
5

के साथ संवाद करने के लिए हमारे पास एक विंडोज सेवा चल रही है और हमारे पास एक कंसोल एप्लिकेशन भी है जिसका उपयोग हम इस सेवा को कॉन्फ़िगर करने के लिए करते हैं, हमारे पास कुछ लॉग रिकॉर्ड होने का विकल्प भी है।कंसोल ऐप विंडोज़ सेवा

इस के साथ बहुत बदसूरत बात यह है कि यह संचार एक टेक्स्ट फ़ाइल द्वारा किया जाता है, कंसोल ऐप एक टेक्स्ट फ़ाइल को लिखता है और सेवा इसे पढ़ती है और इसके विपरीत।

इस संचार के लिए आप क्या उपयोग करेंगे? टीसीपी/आईपी एक विकल्प नहीं है क्योंकि कंसोल ऐप केवल स्थानीय चलने वाली सेवा के लिए उपयोग किया जाएगा।

विंडोज एपीआई SendMessage जाने का रास्ता होना चाहिए?

धन्यवाद!

उत्तर

6

मैं डब्ल्यूसीएफ को विंडोज़ पर सभी कॉमम्स के लिए विचार करने वाली पहली चीज़ के रूप में अनुशंसा करता हूं यदि इसका उपयोग इस तरह की चीज़ के लिए बनाया गया है और इसका उपयोग करने में अपेक्षाकृत आसान है। चूंकि आप टीसीपी को छोड़ रहे हैं, इसलिए मैं Named Pipes Binding का उपयोग करने का सुझाव दूंगा।

इंट्रा-मशीन कॉम के लिए कई विंडोज कॉमर्स एपीआई भी उपलब्ध हैं। Named Pipes (जैसा कि बताया गया है), MailSlots, Shared Memory (Memory Mapped files) आदि

मेरा सुझाव डब्ल्यूसीएफ या मूल रूप से नामित पाइप्स का उपयोग किया जाएगा।

0

साझा मेमोरी? Codeproject पर एक आलेख के लिए here देखें, यहां एक ही साइट पर fastipc आलेख है। एक रैपर के माध्यम से साझा करने के लिए memory mapped file का उपयोग करने के तरीके पर एक ब्लॉग प्रविष्टि है।

उम्मीद है कि यह मदद करता है, सर्वश्रेष्ठ संबंध, टॉम।

1

यदि आप संदेश पास करने के गैर-अवरुद्ध तरीकों का उपयोग करते हैं तो आप डेडलॉक्स का कम जोखिम चलाते हैं। PostMessage, या SendNotifyMessageSendMessage से बेहतर हैं क्योंकि वे कॉलर को अवरुद्ध नहीं करते हैं।

लेकिन वे एक विंडो हैंडल वाली सेवा पर निर्भर करते हैं। क्या यह?

आप WM_COPYDATA संदेश का भी उपयोग कर सकते हैं, केवल एक wParam a lParam से अधिक पास करने के लिए। यदि आप PostMessage के साथ इस संदेश का उपयोग करते हैं, तो आपको सावधान रहना होगा कि जब तक रिसीवर इसके साथ नहीं हो जाता तब तक स्मृति को मुक्त न करें। WM_COPYDATA के लिए SendMessage का उपयोग करना सबसे सुरक्षित है।

+0

+1 - मुझे यकीन नहीं है कि ओपी उनके कोडिंग के लिए क्या उपयोग कर रहा है, लेकिन मैंने अतीत में प्रक्रियाओं के बीच कॉम के लिए WM_COPYDATA PostMessage का उपयोग किया है। अगर स्मृति सही है, तो आप इसे रिसीवर के लिए संदेश रिसेप्शन पर इसे रद्द करने के लिए सेट अप करते हैं। यह अतुल्यकालिक है। – ChrisBD

+0

ध्यान दें कि 'पोस्टमेसेज' दृष्टिकोण Vista पर विफल रहता है और बाद में कुछ स्थितियों में सत्र 0 अलगाव के कारण - उदाहरण देखें http://blogs.technet.com/askperf/archive/2007/04/27/application-compatibility-session-0-isolation.aspx –

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