类厂的IUnknown?

a_ray 2001-10-01 12:14:34
以下摘自《inside com》第七章:
//com对象
HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv)
{
if (iid == IID_IUnknown)
{
*ppv = static_cast<IX*>(this) ;
}
...
}


//类厂
HRESULT __stdcall CFactory::QueryInterface(const IID& iid, void** ppv)
{
if ((iid == IID_IUnknown) || (iid == IID_IClassFactory))
{
*ppv = static_cast<IClassFactory*>(this) ;
}
...
}

岂不是对类厂和com对象分别查询IUnknown会得到不同结果
...全文
120 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
acptvc 2001-10-17
  • 打赏
  • 举报
回复
感谢您使用微软产品。
这个问题实际上是关于com identity的原则:在COM中,IUnknow接口的物理指针唯一标记了一个com 对象---即该com object的identity(在c++中this指针唯一标记了一个c++对象的identity). In other words, com要求从“同一”com 对象上的任何interface调用QueryInterface(IID_IUnknow)得到的IUnknown接口指针的“物理地址”是一样的;否则就认为这些接口指向不同的com 对象。请注意这个原则只适用于IID_IUnknow接口,com并不要求从“同一”com 对象上的任何interface调用QueryInterface(IID_IOtherInterface)得到的IOtherInterface接口指针的“物理地址”是一样的(有些com实现技巧就是利用这个trick的)!


你所说的问题当中,由于类厂与对象是两个不同的com对象,所以QueryInterface(IID_IUnknow)必须返回不同的IUnknow指针值以标志两个不同的com对象。

微软亚洲技术中心 VC技术支持

本贴子仅供CSDN的用户作为参考信息使用。其内容不具备任何法律保障。您需要考虑到并承担使用此信息可能带来的风险。具体事项可参见使用条款 (http://www.csdn.net/microsoft/terms.shtm)。


Only_I 2001-10-17
  • 打赏
  • 举报
回复
gz
demand 2001-10-16
  • 打赏
  • 举报
回复
gz
demand 2001-10-16
  • 打赏
  • 举报
回复
gz
wyzegg 2001-10-16
  • 打赏
  • 举报
回复
两个不一样的对象
karma 2001-10-01
  • 打赏
  • 举报
回复
呵呵,问题是你用的对象指针不同啊!很多对象可以实现完全相同的界面,这并不说明什么,譬如所有的COM对象都实现了IUnknown interface
a_ray 2001-10-01
  • 打赏
  • 举报
回复
但IID相同啊
karma 2001-10-01
  • 打赏
  • 举报
回复
兄弟,你说的非常正确,类厂与对象是两回事,因为它们是不同的对象,你用不同对象的指针征询同一类的界面,传回来的指针自然是不同的
lattice 2001-10-01
  • 打赏
  • 举报
回复
两个IUnknoen不同,说明接口得三个函数实现不同,或者三个函数在不同得类里面实现得
比如一个CA,一个CB
a_ray 2001-10-01
  • 打赏
  • 举报
回复
IID标示一个接口如果说两个IUnknown不同,则应使用不同的IID啊?
lattice 2001-10-01
  • 打赏
  • 举报
回复
你应该明白IID有什么作用。呵呵Interface Identifier.仅仅是个标志而已,如果
你能够弄清楚对象里面(尤其是多重继承)基类和派生类的关系就很容易明白了。

3,248

社区成员

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

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