IEnumMoniker::Next()里面调用了Addref吗?

swdraven2013 2012-07-13 08:44:58

ICreateDevEnum *pCreateDevEnum=0;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)&pCreateDevEnum);

IEnumMoniker *pEm=0;
pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);

pEm->Reset();
ULONG cFetched;
IMoniker *pM;

pEm->Next(1, &pM, &cFetched)



此时可以执行2次pM->Release(),执行第3次才会有问题.问题是:pM到底Addref了几次?哪些函数是会自动执行
Addref的?上面的代码为什么可以执行2次Release??是因为Addref了2次吗?
...全文
225 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ArcRain 2012-07-13
  • 打赏
  • 举报
回复
一般返回IUnknown接口的参数,都是函数内部AddRef,外部调用者自己Release。
这个好象是约定好的COM规则。
swdraven2013 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

Next返回的pM被AddRef了一次,你需要手动Release一次。MSDN文档有详细说明http://msdn.microsoft.com/en-us/library/windows/desktop/dd542677%28v=vs.85%29.aspx

The enumerator is responsible for calling AddRef, and the caller is……
[/Quote]
先谢谢.
这样好像防不胜防啊??怎么知道哪个函数调用了Addref呢?
ArcRain 2012-07-13
  • 打赏
  • 举报
回复
Next返回的pM被AddRef了一次,你需要手动Release一次。MSDN文档有详细说明http://msdn.microsoft.com/en-us/library/windows/desktop/dd542677%28v=vs.85%29.aspx

The enumerator is responsible for calling AddRef, and the caller is responsible for calling Release through each pointer enumerated. If celt is greater than 1, the caller must also pass a non-NULL pointer passed to pceltFetched to know how many pointers to release.

3,245

社区成员

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

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