对不起,如果我的问题之前在这里得到解答,但几天来我一直在互联网上搜索,包括 SO,但没有解决方案。
基本上我想为IE网络浏览器控制(而不是IDE本身)实现下载管理器。我已经阅读了很多关于MSDN的内容,其中包括这个链接,它显示了如何创建它。此示例的问题(以及我在这种情况下的问题)是我在哪里注册/应用 IServiceProvider 到我的 Web 浏览器。文章没有说。但是搜索我发现了这个问题,它说我引用
使用 CAxWindow::QueryHost 获取 IObjectWithSite 指针。呼叫设置站点 传递您的 IServiceProvider 实现。
不幸的是,我不使用或了解ATL,因为我使用wxWidgets。那么我在哪里可以在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;
}
您可以覆盖 wxActiveXContainer::QueryClientSiteInterface 以将您自己的接口实现(如 IServiceProvider 或 IDocHostUIHandler)添加到客户端站点。可以在wxIEContainer类中找到一个示例。