2012-05-16 18 views
6

के माध्यम से एक स्ट्रिंग भेजना/प्राप्त करना हालांकि कुछ संसाधन ऑनलाइन हैं जो इस किसी न किसी विषय को संबोधित करते हैं, मुझे अभी भी एक उत्तर नहीं मिला है जो मेरे लिए काम करता है।
पोस्टमेसेज

मैं अपने VB.net प्रक्रिया और मेरे सी ++ प्रक्रिया के बीच पूर्ण संचार की इच्छा। मैं और सी ++ प्रक्रिया से करने के लिए एक स्ट्रिंग भेजने में सक्षम होना चाहते हैं, लेकिन कुछ समय के मैं प्राप्त करने की आवश्यकता के लिए:

सी ++ प्रक्रिया के लिए एक स्ट्रिंग भेजा जा रहा है, और यह से निपटने के।

यह कुछ बिंदुओं कि मैं पर अनिश्चित हूँ बनाता है, लेकिन मैं इस यथासंभव सरल रखने की कोशिश करता हूँ ...

में निम्नलिखित समारोह घोषणा का उपयोग वीबी;

Declare Function PostMessage Lib "user32" Alias "PostMessageA" (_ 
    ByVal hWnd As IntPtr, _ 
    ByVal Msg As UInteger, _ 
    ByVal wParam As IntPtr, _ 
    ByVal lParam As String _ 
) As Boolean 

और इस तरह का संदेश भेजना;

PostMessage(hWnd, SM_PING, Nothing, "schlampe") 
सी ++ में संदेश पर कब्जा करने के लिए निम्न विधि घोषणा के साथ

;

LRESULT CALLBACK newWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 

और परीक्षण के लिए कि क्या मैं स्ट्रिंग का उपयोग कर उपयोग कर सकता हूं;

char buffer[50]; 
sprintf(buffer, "Received: %s", (char *)lParam); 
MsgBox(buffer); 


मैं जानकारी है कि मैं अनावश्यक हो, लेकिन पूछने के लिए विश्वास है की एक बहुत कुछ अधिक स्किम्ड और यह तुमसे कहता दिया जाएगा।

मेरे समस्या यह है कि संदेश प्राप्त किया और "संभाला" है ... लेकिन सी ++ प्रक्रिया के द्वारा बनाई गई अपने परीक्षण संदेश शामिल नहीं है संदेश बॉक्स (: "प्राप्त:" इसे पढ़ता है) है।

तो, कैसे मैं एक स्ट्रिंग PostMessage/SendMessage के माध्यम से वीबी से सी ++ को भेज सकते हैं?




समाधान:

समाधान के लिए स्वीकार किए जाते हैं जवाब देखें ... लेकिन इसके अलावा, यहाँ कैसे मैं स्ट्रिंग (C++) प्राप्त है:

LRESULT CALLBACK newWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    switch(uMsg) { 
     case WM_COPYDATA: 
      MsgBox("Received a WM_COPYDATA message"); 
      COPYDATASTRUCT * pcds = (COPYDATASTRUCT *)lParam; 
      LPCTSTR lpszString = (LPCTSTR)(pcds->lpData); 
      MsgBox(lpszString); 
      return 1L; 
    } 
    return CallWindowProc(instance->OriginalProcessor(), hwnd, uMsg, wParam, lParam); 
} 


और अंत में, मैं को भारतीय दंड संहिता उदाहरण here इस्तेमाल किया संदेश भेजें। इस उदाहरण संदेश सी # का उपयोग कर भेजता है, लेकिन अवधारणा सब मैं जरूरत (नहीं है कि यह पार्क में टहलने वीबी लिए इस तरह के कोड में परिवर्तित करने के लिए उल्लेख करने के लिए) था। ध्यान दें कि मेरी वीबी कार्यान्वयन में, मैं एक अशक्त चरित्र के साथ स्ट्रिंग समाप्त करने के लिए जरूरत नहीं थी।

+0

क्या विंडो संदेशों का उपयोग करने की आवश्यकता विशिष्ट है? या प्रक्रियाओं के बीच अंतिम लक्ष्य को पारित कर रहा है? उत्तरार्द्ध के लिए, [बेहतर तरीके] (http://en.wikipedia.org/wiki/Inter-process_communication) को प्राप्त करने के लिए हैं। – ulidtko

+2

आपको इसे उपयोग करने से पहले 'COPYDATASTRUCT' के कुछ बुनियादी सत्यापन करना चाहिए। कुछ दुर्भावनापूर्ण एप्लिकेशन आपको 'WM_COPYDATA' संदेशों को फर्जी भेज सकते हैं। – jamesdlin

उत्तर

6

विंडोज संदेशों का उपयोग करते समय, आपको प्रक्रियाओं के बीच स्ट्रिंग डेटा स्थानांतरित करने के लिए WM_COPYDATA का उपयोग करना चाहिए। यदि आप कस्टम संदेश आईडी का उपयोग करते हैं तो स्ट्रिंग डेटा को दो अलग-अलग प्रक्रिया पता रिक्त स्थानों के बीच मार्शल नहीं किया जाएगा।

और यही कारण है कि आपका वर्तमान कोड विफल रहता है। प्राप्त करने की प्रक्रिया lParam में कॉलिंग प्रक्रियाओं के पता स्थान में स्मृति के लिए एक सूचक में पारित की जाती है। और निश्चित रूप से यह दूसरी प्रक्रिया में अर्थहीन है।

जबकि विंडोज संदेशों के साथ प्रक्रियाओं के बीच इस तरह के मार्शल डेटा के अन्य तरीके हैं, WM_COPYDATA अब तक का सबसे सरल है। यदि आपकी आवश्यकता अधिक जटिल हो जाती है तो आपको विंडोज संदेशों की तुलना में अधिक व्यापक आईपीसी दृष्टिकोण पर विचार करने की आवश्यकता हो सकती है।

+0

मैं आईपीसी करने के सामान्य तरीकों का जिक्र करता हूं: पाइप, साझा मेमोरी + म्यूटेक्स, सॉकेट इत्यादि – ulidtko

+1

@ulidtko मैंने अन्य तरीकों से शोध किया है, और मैंने निष्कर्ष निकाला है कि विंडोज़ संदेश मुझे कम परेशानी का कारण बनेंगे, लेकिन धन्यवाद आपकी चिंता। – Spooky

+0

क्या डेटा प्राप्त करने के लिए 'ऑनकॉपीडेटा' का उपयोग करना आवश्यक है? यह ध्यान रखना महत्वपूर्ण है कि मेरे सी ++ डीएलएल को दूसरी प्रक्रिया में इंजेक्शन दिया गया है, और मुझे यह सुनिश्चित नहीं है कि मैं अभी भी 'COPYDATASTRUCT' – Spooky