看过或正在看《com技术内幕》的看过来

littlebao 2003-08-23 11:20:43
请问p152的m_pUnknowInner->QuerInterface()
这里为什么用>QuerInterface而不是调用NodelegatingQueryInterface()
呢?
因为此时m_pUnknowInner指向的是CB()而此时要查询IID_IY接口,所以只可能
通过NodelegatingQueryInterface()来查询才对啊?
...全文
25 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlebao 2003-08-24
  • 打赏
  • 举报
回复
多谢 zhouyong0371(小周周),很抱歉,怎么发消息我还不会呢,呵呵。
不过我终于明白是怎么回事了,
m_pUnknownInner确实是指向INondelegatingUnknown接口,但是,因为
m_pUnknownInner是IUnknown的类型,其实这里他是利用了虚函数的特点,看看下面就知道了


#include "stdafx.h"
#include "iostream"
using namespace std ;

class CA
{
public :
virtual void fun1() = 0 ;
virtual void fun2() = 0 ;
virtual void fun3() = 0 ;
};

class CB
{
public :
virtual void BFun1() = 0 ;
virtual void BFun2() = 0 ;
virtual void BFun3() = 0 ;
};

class CC : public CA
{
public :
virtual void fun1() {cout<<"fun1"<<endl ;}
virtual void fun2() {cout<<"fun2"<<endl ;}
virtual void fun3() {cout<<"fun3"<<endl ;}

};


int _tmain(int argc, _TCHAR* argv[])
{
CB * pB = NULL ;
CC Ctest ;
pB = reinterpret_cast<CB *>(static_cast<CA*>(&Ctest)) ;
pB->BFun1() ;
pB->BFun2() ;
pB->BFun3() ;
return 0;
}

zhouyong0371 2003-08-24
  • 打赏
  • 举报
回复
有问题再问,发消息给我吧
zhouyong0371 2003-08-24
  • 打赏
  • 举报
回复
看P162最下边
HRESULT hr = pB->NondelegatingQueryInterface(iid, ppv);
所以p152中间(void **)&m_pUnknownInner得到的是P160页最上边的
*ppv = static_cast<INondelegatingUnknown *>(this);
明白没有?

所以m_pUnknownInner指向的是INondelegatingUnknown接口。
quanbaoxiao 2003-08-24
  • 打赏
  • 举报
回复
但是m_pUnknowInner->QuerInterface(),而此时内部组件的QueryInterface为

virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv)
{
return m_pUnknowOuter->QueryInterface(iid , ppv) ;
}
而且此时的m_pUnknownOuter指向的是外部组件,他又是如何调用了NondeletegatingQueryInterface 的呢?看不出来他是通过什么方式调用了NondeletegatingQueryInterface 的。但是我跟踪代码时
在m_pUnknowInner->QuerInterface()按f11他确实是跳到了
NondeletegatingQueryInterface。
cgsw12345 2003-08-24
  • 打赏
  • 举报
回复
m_pUnknowInner->QuerInterface()
实质上就是调用了NondeletegatingQueryInterface
I think so!

zhouyong0371 2003-08-24
  • 打赏
  • 举报
回复
m_pUnknowInner->QuerInterface()
实质上就是调用了NondeletegatingQueryInterface P159

P141:
若内部组件......外部组件将通过非委托unknown接口来操作内部组件。

另外,同过运行书上的配套代码,输出信息可以看出它是怎样调用的。

3,245

社区成员

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

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