2011-03-01 16 views
7

मेरे पास सी ++ और एटीएल में लिखे गए दो COM ऑब्जेक्ट्स हैं। एक पुस्तकालय में हैं और मैं उनके आईआईडी और सीएलआईडी जानता हूं।रनिंग ऑब्जेक्ट टेबल (आरओटी) का उपयोग कर दो COM ऑब्जेक्ट्स के बीच संवाद कैसे करें?

मुझे दो साधारण COM ऑब्जेक्ट्स के बीच इस सरल संचार को करने का एक उदाहरण नहीं मिल रहा है। IMONiker कैसे बनाएं और इसे आरओटी में कैसे जोड़ें? और फिर, विभिन्न ऑब्जेक्ट/थ्रेड में अन्य COM में, इस ऑब्जेक्ट के पॉइंटर को कैसे पुनर्प्राप्त करें?

क्या कोई भी एक छोटा सा उदाहरण प्रदान कर सकता है?

संपादित: अधिक जानकारी:

मैं IE के लिए एक ऐड-ऑन लिख रहा हूँ। दो COM ऑब्जेक्ट पूरी तरह से असंबंधित हैं कि आईई विभिन्न उद्देश्यों के लिए लोड करता है। एक बीएचओ (ब्राउज़र हेल्पर ओबेक्ट) है, दूसरा असिंक्रोनस प्लगिंग प्रोटोकॉल (एपीपी) है जो मैंने पाया है कि मैं आरओटी here के माध्यम से संवाद कर सकता हूं।

+0

आप इस मामले में आरओटी का उपयोग क्यों करना चाहते हैं? – sharptooth

+0

@ शार्पतोथ मैं आईई के लिए ऐड-ऑन लिख रहा हूं। मैंने अपना प्रश्न अपडेट किया। –

+0

ठीक है, मैं देखता हूं। आपको IMoniker इंटरफ़ेस को कार्यान्वित करने के लिए खोजना होगा। – sharptooth

उत्तर

6

CreatePointerMoniker के बजाय CreateItemMoniker का उपयोग करने का प्रयास करें - यह आपको आरओटी में आपके ऑब्जेक्ट का नाम निर्दिष्ट करने की अनुमति देता है।

आप इस तरह अपने वस्तु रजिस्टर करने के लिए सक्षम होना चाहिए:

DWORD RegisterInROT(LPCWSTR szObjName, IUnknown* pObj) 
{ 
    DWORD dwCookie = 0; 
    CComPtr<IRunningObjectTable> pROT; 
    if (GetRunningObjectTable(0, &pROT) == S_OK) 
    { 
    CComPtr<IMoniker> pMoniker; 
    if (CreateItemMoniker(NULL, szObjName, &pMoniker) == S_OK) 
     if (pROT->Register(0, pObj, pMoniker, &dwCookie) == S_OK) 
      return dwCookie; 
    } 
    return 0; 
} 

आप अपनी वस्तु ऑटो को मार डाला है जब वहाँ यह करने के लिए कोई और अधिक संदर्भ हैं होने के लिए नहीं करना चाहते हैं, तो आप के बजाय ROTFLAGS_REGISTRATIONKEEPSALIVE निर्दिष्ट कर सकते हैं 0 (check in in MSDN)। समारोह रिटर्न कुकी आप स्पष्ट रूप से बाद में इस तरह सड़ने से अपने वस्तु को निकालने के लिए उपयोग कर सकते हैं:

void RevokeFromROT(DWORD dwCookie) 
{ 
    CComPtr<IRunningObjectTable> pROT; 
    if (GetRunningObjectTable(0, &pROT) == S_OK) 
     pROT->Revoke(dwCookie); 
} 

आप सड़ने से वस्तु प्राप्त कर सकते हैं की तरह इस (आप एक ही नाम का उपयोग करना चाहिए आप निश्चित रूप से वस्तु रजिस्टर करने के लिए इस्तेमाल किया =)

void GetObjectFromROT(LPCWSTR szObjName, IUnknown** pObj) 
{ 
    CComPtr<IRunningObjectTable> pROT; 
    if (GetRunningObjectTable(0, &pROT) == S_OK) 
    { 
    CComPtr<IMoniker> pMoniker; 
    if (CreateItemMoniker(NULL, szObjName, &pMoniker) == S_OK) 
     pROT->GetObject(pMoniker, pObj); 
    } 
}