【问题标题】:How to handle IHttpSecurity::OnSecurityProblem having a IWebBrowser2 object如何处理具有 IWebBrowser2 对象的 IHttpSecurity::OnSecurityProblem
【发布时间】:2011-03-30 15:23:23
【问题描述】:

我似乎无法理解如何将 IHttpSecurity::OnSecurityProblem 的实现提供给 IWebBrowser2 对象。

我知道我需要实现一个类似这样的类:

class CServiceProvider : public IServiceProvider
{
public:
CServiceProvider();
~CServiceProvider(); 

    // IUnknown
    ULONG STDMETHODCALLTYPE AddRef();
    ULONG STDMETHODCALLTYPE Release();
    STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject);

//QueryService
STDMETHODIMP QueryService(REFGUID guidService,REFIID riid,void **ppv);

private:
 ULONG m_ulRefCnt;
};

并且在 QueryService 函数中,当它请求 IID_IHttpSecurity 时,我会返回 IHttpSecurity 接口的实现。

但我的问题是我如何在 IWebBrowser2 对象上设置我的服务提供者实现以及何时?

我的代码是这样的:

IWebBrowser2 *_Browser;

IServiceProvider* pServiceProvider = NULL;
    _Browser->QueryInterface(
                IID_IServiceProvider, 
                (void**)&pServiceProvider);

    IHttpSecurity* pi;
    pServiceProvider->QueryService(IID_IHttpSecurity, &pi);


    _Browser->Navigate(url.AllocSysString(),
                       &flags,
                       &target_frame_name,
                       &post_data,
                       &headers);

这个问题就像我在想如果是,那么我该怎么做,如果不是,你能解释一下它是如何工作的并且可以设置吗?

PS:我只想实现IID_IHttpSecurity接口,QueryService上请求的所有其他接口都应该做系统提供的默认实现...

谢谢

【问题讨论】:

    标签: c++ http com mfc https


    【解决方案1】:

    documentation 中对IServiceProvider 的备注来看,您的IOleClientSite 对象似乎需要实现IServiceProvider。

    【讨论】:

    • 在我的情况下,谁是 IOleClientSite? IWebBrowser2 还是 CWnd?我怎样才能得到这个界面? (我的代码是这样的:CWnd _BrowserWindow; _BrowserWindow.CreateControl(CLSID_WebBrowser, NULL, (WS_VISIBLE | WS_TABSTOP), browser_window_rect, this, AFX_IDW_PANE_FIRST); LPUNKNOWN unknown = _BrowserWindow.GetControlUnknown(); IWebBrowser2 *_Browser; unknown->QueryInterface(IID_IWebBrowser2 ,(void **)&_Browser);
    • 您必须自己实现它并将其传递给Web浏览器的IOleObject::SetClientSite。您可能只为所有 IOleClientSite 方法返回 E_NOTIMPL 。或者你可以使用 COleControlSite(我对 MFC 不是很熟悉)。
    【解决方案2】:

    我已经弄清楚这是怎么做到的了。

    使用 MFC,我们只需要实现 CCustomOccManager,它实现了 COccManager,因为 CreateSite 函数的实现返回了我们的 COleControlSite 的实现(例如 CCustomControlSite)。在此类中,您至少需要覆盖 IServiceProvider 接口的 QueryService 函数,并在此实现中提供您的 IHttpSecurity 实现(当接口需要时)。

    最后,我们使用 MFC 函数 AfxEnableControlContainer 在 App InitInstance 中注册所有这些。

    代码:

    // declare our custom control site to serve as the client site
    class CCustomControlSite:public COleControlSite
    {
    public:
        // constructor associates this site with the container
        CCustomControlSite(COleControlContainer *pCnt):COleControlSite(pCnt){}
    protected:
    DECLARE_INTERFACE_MAP();
    BEGIN_INTERFACE_PART(ServiceProvider, IServiceProvider)
    // declare the interface method(s)
    STDMETHOD(QueryService) ( 
                /* [in] */ REFGUID guidService,
                /* [in] */ REFIID riid,
                /* [out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
    END_INTERFACE_PART(ServiceProvider)
    };
    
    // declare our control container manager
    class CCustomOccManager :public COccManager
    {
    public:
        CCustomOccManager(){}
        // creates an instance of our custom control site and associates it with the container
        COleControlSite* CreateSite(COleControlContainer* pCtrlCont)
        {
            CCustomControlSite *pSite = new CCustomControlSite(pCtrlCont);
            return pSite;
        }
    };
    

    在 App InitInstance 中对我们的实现简单调用 AfxEnableControlContainer:

    // Create a custom control container manager class so we can overide the client site
    CCustomOccManager *pMgr = new CCustomOccManager;
    
    // Set our control containment up but using our control container 
    // management class instead of MFC's default
    AfxEnableControlContainer(pMgr);
    

    如果有人知道如何在不使用 MFC 的情况下完成此操作,请告诉我。

    谢谢

    【讨论】:

    • 我对您将如何实现这一点很感兴趣,例如在 C++ 中(或者在 Delphi 中更好:-),至少描述原理。你已经创建了一个类,它实现了IOleClientSiteIServiceProviderIHttpSecurity 本身,对吧?但是,您是如何将此类传递给 Web 浏览器控件的?何时传递?谢谢!
    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2017-02-07
    • 2020-03-09
    • 2018-09-04
    相关资源
    最近更新 更多