2016-04-26 19 views
6

Ich habe dies für BHO-Erweiterungen gesehen, wo das JavaScript Funktionen in der C++ BHO aufrufen kann. Aber sagen wir mal ich bin kein BHO verwenden, stattdessen habe ich eine C++ Konsolenanwendung, die wie so ein IE-COM-Objekt erstellt:Verwenden von Javascript zum Aufruf von C++ in Internet Explorer

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

Ich habe auch eine Klasse, die „Eigentümer“ der IWebBrowser2-Objekt, das wieder von diesem kommt Funktion.

class BrowserWrapper{ 
    public: 
     CComPtr<IWebBrowser2> pBrowser; 

     void SomeFunction(...) 
} 

Gibt es eine Möglichkeit, eine Funktion wie „Einefunktion“ in der Wrapper-Klasse aus dem JavaScript in dem erzeugten IWebBrowser2 Objekt zu nennen?

Antwort

5

Sie müssen die IDocHostUIHandler interface implementieren und an den Web-Browser so einstellen, mit einem Code ähnlich wie diese (aus dem doc extrahiert):

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()); 
    } 
} 

Sie speziell die GetExternal method

Jetzt implementieren müssen, in IE Javascript (oder vBScript für diese Angelegenheit), können Sie den Host mit einem Aufruf wie folgt zugreifen:

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

Was Sie in getext zurückkehren ernal muss ein IDispatch Objekt sein, das Sie so gestalten können, wie Sie möchten.

0

Sie müssen die IDocHostUIHandler Schnittstelle implementieren. Dies hat eine Methode namens GetExternal - die Sie ein Objekt zurückgeben müssen, das IDispatch implementiert.

Im Javascript, können Sie window.external.something() nennen -, die den Browser für externe Implementierung abfragen verursacht - das IDispatch Objekt - und es wird dann die IDispatchsomething auszuführen verwenden.