自定义下载管理器IWebbrowser2

时间:2012-12-06 23:00:34

标签: c++ com wxwidgets iwebbrowser2

很抱歉,如果我的问题之前已在这里得到解答,但我已经连续几天搜索了包括SO在内的无解决方案。

基本上我想实现IE webbrowser控件的下载管理器(非IDE本身)。 我在MSDN上阅读了很多内容,其中this link显示了如何创建它。 这个例子的问题(以及我在这种情况下的问题)是我在哪里注册/应用IServiceProvider到我的网络浏览器。该条没有说。然而,搜索我发现this question并且它说我引用

  

使用CAxWindow :: QueryHost获取IObjectWithSite指针。致电SetSite   传递你的IServiceProvider实现。

不幸的是,当我使用wxWidgets时,我不使用或了解ATL的任何信息。那么我在哪里可以在wxWebview或“vanilla”MS COM中获得它?

这是我到目前为止所拥有的

HRESULT wxDownloadMgr::Download(IMoniker *pmk, IBindCtx *pbc,DWORD dwBindVerb,  
                  LONG grfBINDF,BINDINFO *pBindInfo, LPCOLESTR pszHeaders,LPCOLESTR pszRedir,UINT uiCP )
{
    // Get URL
    LPOLESTR urlToFile;
    HRESULT result = pmk->GetDisplayName( pbc, NULL, &urlToFile ); 
    //OLECHAR is simply a wchar_t and an LPOLESTR is a wide character string (e.g. wchar_t*). 
    wxString url(urlToFile);
    wxWebViewEvent event(wxEVT_COMMAND_WEB_VIEW_DOWNLOAD_BEGINS,GetId(), url, ""); 
    event.SetEventObject(this);//WHICH OBJECT TO SET HERE????????
    HandleWindowEvent(event);

    ::MessageBox(NULL,"Download","Download Manager",MB_OK);
    return S_OK;
} 

STDMETHODIMP wxServiceProvider::QueryService(REFGUID guidService,
                                            REFIID riid,
                                            void **ppv)
{
    HRESULT hr = E_NOINTERFACE;

    if (guidService == SID_SDownloadManager && riid == IID_IDownloadManager)
    {
        // Create new DownloadMgr object using ATL.
        CComObject<wxDownloadMgr>* pDownloadMgr;
        hr = CComObject<wxDownloadMgr>::CreateInstance(&pDownloadMgr);

        // Query the new CDownloadMgr object for IDownloadManager interface.
        hr = pDownloadMgr->QueryInterface(IID_IDownloadManager, ppv);
    }

    return hr;
}

1 个答案:

答案 0 :(得分:0)

您可以覆盖wxActiveXContainer :: QueryClientSiteInterface,将您自己的接口实现(如IServiceProvider或IDocHostUIHandler)添加到客户端站点。可以在wxIEContainer类中找到一个示例。