关于com的引用计数问题

thinkelse 2016-01-21 10:13:32
com的引用计数有点小疑问:如下:
void addcom(icom** ppcom)

icom* pcomtmp=null;
vocreateinstance(&pcomtmp);
*ppcom = pcomtmp;



main()

icom* pcom=null;
addcom(&pcom);
pcom->release();

这种写法有问题吗?
我现在怀疑addcom中是不是要改成这样:


icom* pcomtmp=null;
vocreateinstance(&pcomtmp);
*ppcom = pcomtmp;
*ppcom->addref();
pcomtmp->release();


请指教!!谢谢!!
...全文
398 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
McuPlayer 2016-04-11
  • 打赏
  • 举报
回复
CoCreateInstance生成一个COM对象,输出一个接口指针,同时内部会AddRef一次 用完,Release一次,就平衡了
fengkewei 2016-03-19
  • 打赏
  • 举报
回复
main()调用CoGetClassObject() ->调用DllGetClassObject得到factory(实际上调用了factory的QueryInterface) factory调用CreateInstance 然后调用coclass的QueryInterface()得到一个coclass的对象 addref()和realse()都内嵌在factory和coclass类之中维护的
fengkewei 2016-03-19
  • 打赏
  • 举报
回复
在coclass的QueryInterface()中, 大概是这样:

STDMETHODIMP ComCar::QueryInterface(REFIID riid, void** ppInterface)
{
if(riid = = IID_IUnknown)
{
*ppInterface = (IUnknown*)(ICar*)this;
((IUnknown*)(*ppInterface))->AddRef();
return S_OK;
}
else if(riid = = IID_ICar)
{
*ppInterface = (ICar*)this;
((IUnknown*)(*ppInterface))->AddRef();
return S_OK;
}
else
{
*ppInterface = NULL;
return E_NOINTERFACE;
}
}

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧