书中152页,HRESULT __stdcall CA::Init()函数的实现部分,黑体字, hr = m_pUnknownInner->QueryInterface(IID_IY,(void**)&m_pIY);为什么是QueryInterface()函数,而不是NondelegatingQueryInterface()函数?
解决方案 »
- CDHtmlDialog 如何捕获网页打开失败的消息
- 在XP的操作系统下,怎样才能将流经网卡的数据包全都抓到呢?
- 求Gif编码的源码
- LoadBitmap加载位图失败
- 如何将一个用CreateWindow生成的Static控件设置为透明?急...
- 哪有 Objective Grid for MFC 下载?
- 请问mfc,api,c runtime到底有什么联系啊?
- №程序高手请进,一个用脚本做的非常简单的交互式密码程序,但怎么也找不出密码所在,一个不可逆算法?解出给500分,up有分。
- c语言
- 在vc中文版中如何编写英文版的程序
- HELLP!!!!!!!
- 得不到的移入消息,我也看不见,怎么回事?
CA聚合了CB的情况下
你看看在CB类厂的CreateInstrance函数是不是用了非委托查询接口函数(nondelegatingQueryInterface)?
这个函数返回的指针是一个指向父类INondelegationUnknown的
这句hr = m_pUnknownInner->QueryInterface(IID_IY,(void**)&m_pIY);最终调用的也是NondelegatingQueryInterface函数
你调试一下就可以看到了。
{
//实现部分;
}
CB类厂的CreateInstrance函数确实用了nondelegatingQueryInterface()函数,
返回的指针(m_pUnknownInner)也是指向INondelegationUnknown,
但是,m_pUnknownInner应该是不能调用QueryInterface,它没有这个成员函数,
它有函数NondelegatingQueryInterface()。
为什么?
在函数NondelegatingQueryInterface()结尾有一句话:
reinterpret_cast<IUnknow*>(*ppv)->AddRef();
是干什么用的?
>>reinterpret_cast<IUnknow*>(*ppv)->AddRef();道理和刚才说的差不多,因为非代理接口和IUnknown的内存结构一致,所以这样转型是没问题的。