2016-04-26 45 views
6

Bunu, JavaScript'in C++ BHO'daki işlevleri çağırabileceği BHO uzantıları için gördüm.Internet Explorer'da C++ Aramak için Javascript Kullanımı

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

Ben de bundan geri geliyor IWebBrowser2 nesne "sahibi olan" bir sınıf vardır: Ama bunun yerine bir IE COM nesnesi şöyle yaratan bir C++ konsol uygulaması var, bir BHO kullanmıyorum diyelim işlevi.

class BrowserWrapper{ 
    public: 
     CComPtr<IWebBrowser2> pBrowser; 

     void SomeFunction(...) 
} 

kökenli IWebBrowser2 nesnesindeki JavaScript gelen sarıcı sınıfında "bir_işlev" gibi bir işlevi çağırmak için bir yolu var mı?

cevap

5

Sen IDocHostUIHandler interface uygulamak ve buna benzer bir kod ile web tarayıcısına ayarlamanız gerekir (doc çıkarılan):

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

Sen özellikle Şimdi GetExternal method

uygulaması gerektiğini, IE en içinde javaScript (veya bu konuda vbscript), böyle bir çağrısı ile ev sahibi erişebilirsiniz: Eğer GetExt dönmek ne

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

ernal , istediğiniz şekilde tasarlayabileceğiniz bir IDispatch nesnesi olmalıdır.

0

IDocHostUIHandler arabirimini uygulamanız gerekir. Bu, GetExternal adında bir yönteme sahiptir; bu, IDispatch'i uygulayan bir nesneyi döndürmeniz gerekir. IDispatch nesne - - Harici uygulama için sorgulamak için tarayıcı neden olacaktır - javascript olarak

, sen window.external.something() arayabilir ve daha sonra something yürütmek için IDispatch kullanacaktır.