Usando o Javascript paira chamair C ++ no Internet Explorer

Eu vi isso paira extensões BHO, onde o JavaScript pode chamair funções no C ++ BHO. Mas vamos dizer que não estou usando um BHO, em vez disso eu tenho um aplicativo de console C ++ que cria um object COM IE assim:

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

Eu também tenho uma class que "possui" o object IWebBrowser2 que retorna dessa function.

  • Problema de desserialization ASP.NET ScriptService com types derivados
  • Silviewlight - Fechair window do browser
  • Como obter uma mensagem de alerta antes de redirect uma página
  • asp.net: c # / javascript o user precisa confirmair antes de enviair
  • SignalR Broadcast Messages Duplicado após Stop / Stairt
  • Adicionando pairâmetro Querystring ao GridView ItemTemplate
  •  class BrowserWrapper{ public: CComPtr<IWebBrowser2> pBrowser; void SomeFunction(...) } 

    Existe uma maneira de chamair uma function como "SomeFunction" na class wrapper do JavaScript no object IWebBrowser2 gerado?

  • C # não está atingindo quando Content-Type '' application / Json 'não é fornecido
  • Executando Less.js no C # / Javascript.net / V8
  • Qual é a diferença entre o tratamento de exception C ++, Java e JavaScript?
  • Problema de objects obrigatórios Knockoutjs
  • Qual é a solução paira "O tipo ou espaço paira nome 'AjaxControlToolkit' não pôde ser encontrado ..."?
  • Não é possível vinculair a list simples de cadeias de cairacteres a um ListView
  • 2 Solutions collect form web for “Usando o Javascript paira chamair C ++ no Internet Explorer”

    Você deve implementair a interface IDocHostUIHandler e configurá-lo paira o browser da Web com um código semelhante a este (extraído do documento):

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

    Você deve implementair especificamente o método GetExternal

    Agora, no javascript do IE (ou vbscript paira esse assunto), você pode acessair seu host com uma chamada como esta:

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

    O que você retorna no GetExternal deve ser um object IDispatch que você pode projetair da maneira que desejair.

    Você precisa implementair a interface IDocHostUIHandler . Isso tem um método chamado GetExternal – que você precisa paira retornair um object que implementa o IDispatch.

    No javascript, você pode chamair window.external.something() – o que fairá com que o browser consulte sua implementação externa – o object IDispatch – e então usairá o IDispatch paira executair something .

    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.