chtmlview中实现IDownloadManager时,创建CComObject::CreateInstance崩溃。
16lz
2021-01-22
STDMETHODIMPCDocHostSite::XServiceProvider
::QueryService(REFGUIDguidService,
REFIIDriid,
void**ppvObject)
{
if(guidService==SID_SInternetSecurityManager&&
riid==IID_IInternetSecurityManager)
{
METHOD_PROLOGUE(CDocHostSite,ServiceProvider)
HRESULThr=(HRESULT)pThis->ExternalQueryInterface(&riid,ppvObject);
returnhr;
}
elseif((guidService==SID_SDownloadManager)&&riid==IID_IDownloadManager)
{
CComObject<CDownLoadMgr>*pDownloadMgr=NULL;
HRESULThr=CComObject<CDownLoadMgr>::CreateInstance(&pDownloadMgr);
if((SUCCEEDED(hr))||(pDownloadMgr))
{
returnpDownloadMgr->QueryInterface(IID_IDownloadManager,ppvObject);
}
}
else
{
*ppvObject=NULL;
}
returnE_NOINTERFACE;
}
我的cDownloadmgr类:
.h文件
#pragmaonce
#include"downloadmgr.h"
classCDownLoadMgr:
publicCComObjectRootEx<CComSingleThreadModel>,
publicIDownloadManager
{
public:
CDownLoadMgr();
~CDownLoadMgr();
BEGIN_COM_MAP(CDownLoadMgr)
COM_INTERFACE_ENTRY(IDownloadManager)
END_COM_MAP()
//***IDownloadManager***
STDMETHODIMPDownload(IMoniker*pmk,IBindCtx*pbc,DWORDdwBindVerb,
LONGgrfBINDF,
BINDINFO*pBindInfo,
LPCOLESTRpszHeaders,
LPCOLESTRpszRedir,
UINTuiCP);
//Toinitializeclass
};
.cpp
#include"StdAfx.h"
#include"MyDownload.h"
CDownLoadMgr::CDownLoadMgr()
{
}
CDownLoadMgr::~CDownLoadMgr()
{
inti=0;
}
STDMETHODIMPCDownLoadMgr::Download(IMoniker*pmk,IBindCtx*pbc,DWORDdwBindVerb,
LONGgrfBINDF,BINDINFO*pBindInfo,
LPCOLESTRpszHeaders,LPCOLESTRpszRedir,UINTuiCP)
{
::MessageBox(NULL,_T("Download"),_T("DownloadManager"),MB_OK);
returnS_OK;
}
使用vs2008编译可以通过。点击下载连接的时候,在HRESULThr=CComObject<CDownLoadMgr>::CreateInstance(&pDownloadMgr);这步崩溃了。
看了下http://bbs.csdn.net/topics/380232604这个帖子,
按照他说的添加了两行代码,
CComObject<CDownLoadMgr>*pDownloadMgr=NULL;
CComModule_Module;
pAtlModule=&_Module;
HRESULThr=CComObject<CDownLoadMgr>::CreateInstance(&pDownloadMgr);
CreateInstance可以通过,但还没调到CDownLoadMgr::Download,又崩溃了。这次停在了
virtual~CComObject()throw()
{
m_dwRef=-(LONG_MAX/2);
FinalRelease();
#ifdef_ATL_DEBUG_INTERFACES
_AtlDebugInterfacesModule.DeleteNonAddRefThunk(_GetRawUnknown());
#endif
_pAtlModule->Unlock();
}
_pAtlModule->Unlock();这个地方。
我的这个实现有什么问题吗?
根据你的程序,继承CAtlModuleT<T>的继承类。
比如AtlExeModule<T>
::QueryService(REFGUIDguidService,
REFIIDriid,
void**ppvObject)
{
if(guidService==SID_SInternetSecurityManager&&
riid==IID_IInternetSecurityManager)
{
METHOD_PROLOGUE(CDocHostSite,ServiceProvider)
HRESULThr=(HRESULT)pThis->ExternalQueryInterface(&riid,ppvObject);
returnhr;
}
elseif((guidService==SID_SDownloadManager)&&riid==IID_IDownloadManager)
{
CComObject<CDownLoadMgr>*pDownloadMgr=NULL;
HRESULThr=CComObject<CDownLoadMgr>::CreateInstance(&pDownloadMgr);
if((SUCCEEDED(hr))||(pDownloadMgr))
{
returnpDownloadMgr->QueryInterface(IID_IDownloadManager,ppvObject);
}
}
else
{
*ppvObject=NULL;
}
returnE_NOINTERFACE;
}
我的cDownloadmgr类:
.h文件
#pragmaonce
#include"downloadmgr.h"
classCDownLoadMgr:
publicCComObjectRootEx<CComSingleThreadModel>,
publicIDownloadManager
{
public:
CDownLoadMgr();
~CDownLoadMgr();
BEGIN_COM_MAP(CDownLoadMgr)
COM_INTERFACE_ENTRY(IDownloadManager)
END_COM_MAP()
//***IDownloadManager***
STDMETHODIMPDownload(IMoniker*pmk,IBindCtx*pbc,DWORDdwBindVerb,
LONGgrfBINDF,
BINDINFO*pBindInfo,
LPCOLESTRpszHeaders,
LPCOLESTRpszRedir,
UINTuiCP);
//Toinitializeclass
};
.cpp
#include"StdAfx.h"
#include"MyDownload.h"
CDownLoadMgr::CDownLoadMgr()
{
}
CDownLoadMgr::~CDownLoadMgr()
{
inti=0;
}
STDMETHODIMPCDownLoadMgr::Download(IMoniker*pmk,IBindCtx*pbc,DWORDdwBindVerb,
LONGgrfBINDF,BINDINFO*pBindInfo,
LPCOLESTRpszHeaders,LPCOLESTRpszRedir,UINTuiCP)
{
::MessageBox(NULL,_T("Download"),_T("DownloadManager"),MB_OK);
returnS_OK;
}
使用vs2008编译可以通过。点击下载连接的时候,在HRESULThr=CComObject<CDownLoadMgr>::CreateInstance(&pDownloadMgr);这步崩溃了。
看了下http://bbs.csdn.net/topics/380232604这个帖子,
按照他说的添加了两行代码,
CComObject<CDownLoadMgr>*pDownloadMgr=NULL;
CComModule_Module;
pAtlModule=&_Module;
HRESULThr=CComObject<CDownLoadMgr>::CreateInstance(&pDownloadMgr);
CreateInstance可以通过,但还没调到CDownLoadMgr::Download,又崩溃了。这次停在了
virtual~CComObject()throw()
{
m_dwRef=-(LONG_MAX/2);
FinalRelease();
#ifdef_ATL_DEBUG_INTERFACES
_AtlDebugInterfacesModule.DeleteNonAddRefThunk(_GetRawUnknown());
#endif
_pAtlModule->Unlock();
}
_pAtlModule->Unlock();这个地方。
我的这个实现有什么问题吗?
4 个解决方案
#1
根据你的程序,继承CAtlModuleT<T>的继承类。
比如AtlExeModule<T>
更多相关文章
- html2canvas 识别 svg 解决方案
- HTML5用户身份认证源代码:注册、登录、会话保持的解决方案
- 用于在表中强制换行的PHP或HTML/CSS解决方案
- 如何实现分布式文件上传解决方案?
- 一套PHP做app接口的解决方案
- curl获取网页内容出现乱码或为空的解决方案,另附curl_getinfo函数
- PHP XAMPP配置PHP环境和Apache80端口被占用解决方案
- mysql主从同步报slave_sql_running:no的解决方案
- win7下Django的MySql安装,问题解决方案