Вызов BHO из функции Javascript - PullRequest
1 голос
/ 29 марта 2011

Привет,

Я новичок в среде разработки расширений MSDN / Windows / MFC / IE.Я хочу перенести мой аддон Firefox и Chrome в аддон IE.Я в значительной степени преуспел в создании BHO и смог внедрить свой код в каждое окно IE, как отмечалось здесь - http://msdn.microsoft.com/en-us/library/bb250489%28v=vs.85%29.aspx

Я застрял только с проблемой вызоваBHO функция из JavaScript.Просто нужна помощь для возможности вызова

window.HelloWorld.StoreInfo () из JavaScript.Пожалуйста, смотрите мой фрагмент кода ниже.Мой 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;
}

Я не хочу использовать ActiveX в первую очередь из-заограничения безопасности.

Спасибо.

1 Ответ

2 голосов
/ 30 марта 2011

Вам необходимо назначить объект автоматизации, который предоставляет метод без параметров StoreInfo свойству window.HelloWorld (InvokeEx с DISPATCH_PROPERTYPUT). Прямо сейчас вы ничего не присваиваете свойству.

...