在 Internet Explorer 中使用 Javascript 调用C++
Using Javascript to Call C++ in Internet Explorer
我已经在BHO扩展中看到了这一点,其中JavaScript可以在C++BHO中调用函数。但是假设我没有使用 BHO,而是我有一个C++控制台应用程序,它创建了一个 IE COM 对象,如下所示:
HRESULT hr = CoCreateInstance(
CLSID_InternetExplorer,
NULL,
CLSCTX_LOCAL_SERVER,
IID_IWebBrowser2,
(void**)&_cBrowser);
我还有一个类,它"拥有"从此函数返回的 IWebBrowser2 对象。
class BrowserWrapper{
public:
CComPtr<IWebBrowser2> pBrowser;
void SomeFunction(...)
}
有没有办法从生成的 IWebBrowser2 对象的 JavaScript 中调用包装类中的"SomeFunction"这样的函数?
您必须实现 IDocHostUIHandler 接口,并使用类似于以下内容的代码将其设置为 Web 浏览器(摘自文档):
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 方法
现在,在IE的javascript(或vbscript)中,您可以通过这样的调用访问您的主机:
var ext = window.external; // this will call your host's IDocHostUIHandler.GetExternal method
ext.SomeFunction(...); // implemented by your object
在 GetExternal 中返回的内容必须是可以按照所需方式设计的IDispatch
对象。
您需要
实现IDocHostUIHandler
接口。这有一个名为 GetExternal
的方法 - 您需要返回实现 IDispatch 的对象。
在 javascript 中,您可以调用 window.external.something()
- 这将导致浏览器查询您的外部实现 - IDispatch
对象 - 然后它将使用该IDispatch
来执行something
。
相关文章:
- 如何使用EM_JS从带有参数的C++调用javascript方法
- 在 v8 JavaScript 中重复调用C++是否有巨大的开销?
- 如何在 C++ 中从 V8 调用 Javascript 函数
- 从C++代码抛出错误调用 JavaScript 回调函数 - nbind
- node.js Nan:在函数C++调用 JavaScript 回调
- 如何使用 cocos creator 在 Cocos2d-X/Cocos2d-JS 中调用 javascript 函数并
- v8.从 C++ 保存和调用 JavaScript 函数
- 如何通过 MS Chakracore JavaScript 引擎调用C++函数或方法
- 我如何调用Mozilla Rhino的Javascript中的C++
- 在使用Embind的Javascript中,仅仅调用deleteLater()就足以避免内存泄漏吗
- 在WindBG断点命令中调用JavaScript函数
- 如何使用iOS上的JavaScriptCore创建从JavaScript调用的C 回调
- QT WebKit桥:使用JavaScript调用C 功能
- 我可以从JavaScript调用C 函数
- 在 Internet Explorer 中使用 Javascript 调用C++
- 如何使用 QT/Python 从 Javascript 调用C++函数
- 创建一个仅提供通过javascript调用的函数的ActiveX控件.最好的方法
- 我如何从javascript调用c++代码与NPAPI
- 如何从javascript调用c++方法
- 是否可以使用Emscripten从JavaScript调用C++函数