在 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);
我还有一个 class,其中 "owns" 从该函数返回的 IWebBrowser2 对象。
class BrowserWrapper{
public:
CComPtr<IWebBrowser2> pBrowser;
void SomeFunction(...)
}
有没有办法从派生的 IWebBrowser2 对象中的 JavaScript 调用包装器 class 中的 "SomeFunction" 之类的函数?
您必须实施 IDocHostUIHandler interface 并使用类似于此的代码(从文档中提取)将其设置到网络浏览器:
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 的 javascript(或 vbscript)中,您可以通过这样的调用访问您的主机:
var ext = window.external; // this will call your host's IDocHostUIHandler.GetExternal method
ext.SomeFunction(...); // implemented by your object
您在 GetExternal return 中 必须是 一个 IDispatch
对象,您可以按照自己的方式进行设计。
您需要实现 IDocHostUIHandler
接口。这有一个名为 GetExternal
的方法 - 您需要 return 一个实现 IDispatch 的对象。
在 javascript 中,您可以调用 window.external.something()
- 这将导致浏览器查询您的外部实现 - IDispatch
对象 - 然后它将使用 IDispatch
执行 something
.
我在 BHO 扩展中看到了这一点,其中 JavaScript 可以调用 C++ BHO 中的函数。但是可以说我没有使用 BHO,而是我有一个 C++ 控制台应用程序,它创建一个 IE COM 对象,如下所示:
HRESULT hr = CoCreateInstance(
CLSID_InternetExplorer,
NULL,
CLSCTX_LOCAL_SERVER,
IID_IWebBrowser2,
(void**)&_cBrowser);
我还有一个 class,其中 "owns" 从该函数返回的 IWebBrowser2 对象。
class BrowserWrapper{
public:
CComPtr<IWebBrowser2> pBrowser;
void SomeFunction(...)
}
有没有办法从派生的 IWebBrowser2 对象中的 JavaScript 调用包装器 class 中的 "SomeFunction" 之类的函数?
您必须实施 IDocHostUIHandler interface 并使用类似于此的代码(从文档中提取)将其设置到网络浏览器:
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 的 javascript(或 vbscript)中,您可以通过这样的调用访问您的主机:
var ext = window.external; // this will call your host's IDocHostUIHandler.GetExternal method
ext.SomeFunction(...); // implemented by your object
您在 GetExternal return 中 必须是 一个 IDispatch
对象,您可以按照自己的方式进行设计。
您需要实现 IDocHostUIHandler
接口。这有一个名为 GetExternal
的方法 - 您需要 return 一个实现 IDispatch 的对象。
在 javascript 中,您可以调用 window.external.something()
- 这将导致浏览器查询您的外部实现 - IDispatch
对象 - 然后它将使用 IDispatch
执行 something
.