Internet explorer 从Javascript函数调用BHO

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,但不能识别其中的函数 我怀疑

您好

我不熟悉MSDN/Windows编程/MFC/IE扩展开发环境。我希望将我的Firefox和Chrome插件移植到IE插件中。我已经成功地创建了一个BHO,并且能够将我的代码注入到每个IE窗口中,如下所述-

我只遇到了能够从javascript调用BHO函数的问题。只是需要帮助才能打电话

javascript中的window.HelloWorld.StoreInfo()。请参阅下面我的代码片段。我的javascript可以识别window.HelloWorld,但不能识别其中的函数

我怀疑IDispatchEx与此有关

    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上,讨论和答案可在中找到。