2016-04-26 14 views
6

में सी ++ पर कॉल करने के लिए जावास्क्रिप्ट का उपयोग करके मैंने इसे बीएचओ एक्सटेंशन के लिए देखा है, जहां जावास्क्रिप्ट सी ++ बीएचओ में फ़ंक्शन कॉल कर सकता है। लेकिन कहते हैं कि मैं एक BHO ​​उपयोग नहीं कर रहा की सुविधा देता है, बजाय मैं एक सी ++ सांत्वना आवेदन कि इतने की तरह एक IE COM वस्तु बनाता है:इंटरनेट एक्सप्लोरर

HRESULT hr = CoCreateInstance(
      CLSID_InternetExplorer, 
      NULL, 
      CLSCTX_LOCAL_SERVER, 
      IID_IWebBrowser2, 
      (void**)&_cBrowser); 

मैं भी एक वर्ग है जो "मालिक" IWebBrowser2 उद्देश्य यह है कि इस से वापस आता है समारोह।

class BrowserWrapper{ 
    public: 
     CComPtr<IWebBrowser2> pBrowser; 

     void SomeFunction(...) 
} 

वहाँ एक रास्ता "SomeFunction" पैदा की IWebBrowser2 वस्तु में जावास्क्रिप्ट से आवरण कक्षा में की तरह एक समारोह कॉल करने के लिए है?

उत्तर

5

आप IDocHostUIHandler interface को लागू करने और एक कोड इस के समान के साथ वेब ब्राउज़र के लिए यह सेट करना होगा (doc से निकाली गई):

ComPtr<IDispatch> spDocument; 
hr = spWebBrowser2->get_Document(&spDocument); 
if (SUCCEEDED(hr) && (spDocument != nullptr)) 
{ 
    // Request default handler from MSHTML client site 
    ComPtr<IOleObject> spOleObject; 
    if (SUCCEEDED(spDocument.As(&spOleObject))) 
    { 
     ComPtr<IOleClientSite> spClientSite; 
     hr = spOleObject->GetClientSite(&spClientSite); 
     if (SUCCEEDED(hr) && spClientSite) 
     { 
      // Save pointer for delegation to default 
      m_spDefaultDocHostUIHandler = spClientSite; 
     } 
    } 

    // Set the new custom IDocHostUIHandler 
    ComPtr<ICustomDoc> spCustomDoc; 
    if (SUCCEEDED(spDocument.As(&spCustomDoc))) 
    { 
     // NOTE: spHandler is user-defined class 
     spCustomDoc->SetUIHandler(spHandler.Get()); 
    } 
} 

आप विशेष रूप से GetExternal method

को लागू करना चाहिए अब, IE के में जावास्क्रिप्ट (या उस बात के लिए VBScript), तो आप इस तरह एक फोन के साथ अपने मेजबान पहुँच सकते हैं:

var ext = window.external; // this will call your host's IDocHostUIHandler.GetExternal method 
ext.SomeFunction(...); // implemented by your object 

आप GetExt में क्या वापस ernal एक IDispatch ऑब्जेक्ट होना चाहिए जिसे आप इच्छित तरीके से डिज़ाइन कर सकते हैं।

0

आपको IDocHostUIHandler इंटरफ़ेस को लागू करने की आवश्यकता है। इसमें GetExternal नामक एक विधि है - जिसे आपको उस ऑब्जेक्ट को वापस करने की आवश्यकता है जो IDISpatch लागू करता है।

जावास्क्रिप्ट में, आप window.external.something() कॉल कर सकते हैं - जो अपने बाहरी कार्यान्वयन के लिए क्वेरी करने के लिए ब्राउज़र का कारण होगा - IDispatch वस्तु - और यह तो IDispatch का उपयोग करेगा something निष्पादित करने के लिए।

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