Internet explorer 从Javascript函数调用BHO
您好 我不熟悉MSDN/Windows编程/MFC/IE扩展开发环境。我希望将我的Firefox和Chrome插件移植到IE插件中。我已经成功地创建了一个BHO,并且能够将我的代码注入到每个IE窗口中,如下所述- 我只遇到了能够从javascript调用BHO函数的问题。只是需要帮助才能打电话 javascript中的window.HelloWorld.StoreInfo()。请参阅下面我的代码片段。我的javascript可以识别window.HelloWorld,但不能识别其中的函数 我怀疑IDispatchEx与此有关Internet explorer 从Javascript函数调用BHO,internet-explorer,bho,ieaddon,Internet Explorer,Bho,Ieaddon,您好 我不熟悉MSDN/Windows编程/MFC/IE扩展开发环境。我希望将我的Firefox和Chrome插件移植到IE插件中。我已经成功地创建了一个BHO,并且能够将我的代码注入到每个IE窗口中,如下所述- 我只遇到了能够从javascript调用BHO函数的问题。只是需要帮助才能打电话 javascript中的window.HelloWorld.StoreInfo()。请参阅下面我的代码片段。我的javascript可以识别window.HelloWorld,但不能识别其中的函数 我怀疑
STDMETHODIMP CHelloWorldBHO::SetSite(IUnknown* pUnkSite)
{
if (pUnkSite != NULL)
{
// Cache the pointer to IWebBrowser2.
HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser);
if (SUCCEEDED(hr))
{
// Register to sink events from DWebBrowserEvents2.
hr = DispEventAdvise(m_spWebBrowser);
if (SUCCEEDED(hr))
{
m_fAdvised = TRUE;
}
}
}
else
{
// Unregister event sink.
if (m_fAdvised)
{
DispEventUnadvise(m_spWebBrowser);
m_fAdvised = FALSE;
}
// Release cached pointers and other resources here.
m_spWebBrowser.Release();
}
// Call base class implementation.
return IObjectWithSiteImpl<CHelloWorldBHO>::SetSite(pUnkSite);
}
void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
{
HRESULT hr = S_OK;
// Query for the IWebBrowser2 interface.
CComQIPtr<IWebBrowser2> spTempWebBrowser = pDisp;
// Is this event associated with the top-level browser?
if (spTempWebBrowser && m_spWebBrowser &&
m_spWebBrowser.IsEqualObject(spTempWebBrowser))
{
// Get the current document object from browser...
CComPtr<IDispatch> spDispDoc;
hr = m_spWebBrowser->get_Document(&spDispDoc);
if (SUCCEEDED(hr))
{
// ...and query for an HTML document.
CComQIPtr<IHTMLDocument2> spHTMLDoc = spDispDoc;
if (spHTMLDoc != NULL)
{
CComQIPtr<IHTMLWindow2> pWindow;
spHTMLDoc->get_parentWindow(&pWindow);
CComQIPtr<IDispatch> pScriptDisp(pWindow);
IDispatchEx *pScriptDispEx;
pWindow->QueryInterface(&pScriptDispEx);
DISPID did;
hr = pScriptDispEx->GetDispID(CComBSTR("HelloWorld"), fdexNameEnsure, &did);
CComVariant dest;
DISPPARAMS dp = { 0, 0, 0, 0 };
hr = pScriptDispEx->Invoke( did, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dp, &dest, NULL, NULL );
}
}
}
}
BOOL CHelloWorldBHO::StoreInfo()
{
// Store params passed from javascript
return true;
}
STDMETHODIMP CHelloWorldBHO::设置站点(IUnknown*朋克站点)
{
if(朋克站点!=NULL)
{
//缓存指向IWebBrowser2的指针。
HRESULT hr=pUnkSite->QueryInterface(IID_IWebBrowser2,(void**)和m_spWebBrowser);
如果(成功(hr))
{
//注册以接收来自DWebBrowserEvents2的事件。
hr=分散式台钳(m_spWebBrowser);
如果(成功(hr))
{
m_fAdvised=真;
}
}
}
其他的
{
//取消注册事件接收器。
如果(m_fAdvised)
{
Dispateventunadvise(m_spWebBrowser);
m_fAdvised=假;
}
//在此处释放缓存指针和其他资源。
m_spWebBrowser.Release();
}
//调用基类实现。
返回IObjectWithSiteImpl::SetSite(pUnkSite);
}
void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch*pDisp,变体*pvarURL)
{
HRESULT hr=S_正常;
//查询IWebBrowser2接口。
CComQIPtr spTempWebBrowser=pDisp;
//此事件是否与顶级浏览器关联?
如果(spTempWebBrowser和&m_spWebBrowser&&
m_spWebBrowser.IsEqualObject(spTempWebBrowser))
{
//从浏览器中获取当前文档对象。。。
CComPtr spDispDoc;
hr=m_spWebBrowser->get_Document(&spDispDoc);
如果(成功(hr))
{
//…并查询HTML文档。
CCOMKIPTR spHTMLDoc=spDispDoc;
如果(spHTMLDoc!=NULL)
{
CCOMKIPTR pWindow;
spHTMLDoc->get_parentWindow(&pWindow);
CComQIPtr pscript disp(pWindow);
IDispatchEx*PScript分散;
pWindows->QueryInterface(&pscript分散);
迪斯皮德做到了;
hr=pScriptDispEx->GetDispID(CComBSTR(“HelloWorld”)、fdexnamesure和did);
可变目的地;
DISPPARAMS dp={0,0,0,0};
hr=pScriptDispEx->Invoke(did、IID、NULL、LOCALE、SYSTEM、DEFAULT、DISPATCH、PROPERTYGET、&dp、&dest、NULL、NULL);
}
}
}
}
BOOL CHelloWorldBHO::StoreInfo()
{
//存储从javascript传递的参数
返回true;
}
由于安全限制,我不希望使用ActiveX
谢谢。您需要为window.HelloWorld属性(带有DISPATCH\u PROPERTYPUT的InvokeEx)分配一个自动对象,该对象公开一个StoreInfo无参数方法。现在,您没有为属性分配任何内容。您需要为window.HelloWorld属性(带有DISPATCH\u PROPERTYPUT的InvokeEx)分配一个自动对象,该对象公开一个StoreInfo无参数方法。现在您没有为属性分配任何内容。此问题也已发布在MSDN上,讨论和答案可在中找到。此问题也已发布在MSDN上,讨论和答案可在中找到。