【问题标题】:Custom Download Manager IWebbrowser2自定义下载管理器 IWebbrowser2
【发布时间】:2012-12-06 23:00:33
【问题描述】:

很抱歉,如果我的问题之前已在此处得到解答,但我已经在互联网上搜索了几天,包括 SO,但没有任何解决方案。

基本上我想为 IE 浏览器控件(不是 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;
}

【问题讨论】:

    标签: c++ com wxwidgets iwebbrowser2


    【解决方案1】:

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

    【讨论】:

    • 你的意思是 bool wxIEContainer::QueryClientSiteInterface(REFIID iid, void **_interface, const char *&desc) { if (m_uiHandler && IsEqualIID(iid, wxIID_IDocHostUIHandler)) { *_interface = (IUnknown *) (wxIDocHostUIHandler *) m_uiHandler; desc = "IDocHostUIHandler";返回真; } 返回假; }
    • 是的,这是一个如何扩展 wxActiveXContainer 的例子
    • 你的意思是我做了类似的事情:pastebin.com/AekYv70N 或者我应该创建新的 wxServiceProvider 并将其指针分配给 m_uiHandler?目前我刚刚复制并修改了那里的代码
    • 您可以像 wxIEContainer 一样编写自己的 wxActiveXContainer,或者只是从 wxIEContainer 派生并覆盖 QueryClientSiteInterface。请注意,您实际上需要在 QueryClientSiteInterface 中返回正确的接口,当 webbrowser 控件请求 IServiceProvider 时,您不能返回 IDocHostUIHandler
    • 我刚刚复制了 wxWebview 中的代码并添加了对 IServiceProvider 的检查,即 else if (m_uiHandler && IsEqualIID(iid, wxIID_ISERVICEPROVIDER)) 所以当我完成这一切时,我需要做的就是自定义下载工作?我现在要睡觉了,这里很安静!
    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多