• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 关于<<com原理与应用>>的三个问题

关于<<com原理与应用>>的三个问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了&lt gt,&lt br gt,阿长与 lt 山海经 gt,jquery gt lt,&lt br gt lt br gt等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于<<com原理与应用>>的三个问题
描述:

在看<<com原理与应用>>,有一段话不是很理解,请高手赐教!!!
一、
一个组件类CMy实现了两个接口IA、IB,它们都继承自接口IUnknown,在查询IUnknown接口时,我们先把this转换成IA 或者 IB 指针,再转换成IUnknown,但我们必须保证每次查到的IUnknown接口完全一致。
那么我就有点不明白了,为什么会返回相同的指针?我按书中的要求,在CMy::QueryInterface中
用 *ppv = (IUnknown *)(IA *)this 
或 *ppv = (IUnknown *)(IB *)this ,它们的*ppv不一样,也就是说,获得的IUnknown接口不一致,该如何解释???
二、
类CMy实现了两个接口IA、IB,能不能说同时也实现了接口IUnknow?
三、
为什么每次用VC查看接口IA、IB时,只能看到接口IUnknow中的那三个函数?却看不到其它接口的函数?如何解释?


解决方案1:

其实你在实现QueryInterface是只要实现那5个规则就好了。

解决方案2:

一般在将this指针值赋给某个void指针时,应先将其转换成合适的类型。一个有趣的例子是返回
IUnknown指针的情形。某些程序员可能会用:
*ppv = static_cast<IUnknown*>(this); 
但是将this指针转换成IUnknown*是不明确的。这是由于IX和IY都是从
IUnknown继承得到的。
因此在这种情况下,返回值应该是
*ppv = static_cast<IUnknown*>(static_cast<IX*>(this)) 或者是
*ppv = static_cast<IUnknown*>(static_cast<IY*>(this))。
只不过在在上面,选择哪一个是无关紧要的,因为它们使用的都是同一实现。
但是在代码中要保持一致,因这两个指针实际上是不一样的,并且COM
要求对IUnknown接口返回相同的指针。
上面的话是《COM技术内幕——微软组件对象模型》书中的一段。

解决方案3:

1是COM规范,目的是提供一个有效的方法来判断两个接口指针是否属于同一个COM对象实例,但其他接口指针不具此性质,甚至可以两次查询同一个接口而返回不同的值,比如teatoff接口。

解决方案4:

1 所谓“必须保证每次查到的IUnknown接口完全一致”指的是 *ppv的值(即返回值)相同。
2 对,这就是所谓的“菱形继承”了。
3 你的意思是说只有IUnknow的三个函数可以不查询直接调用,别的函数必须查询是吧?这是因为你是把*ppv作为 IUnknow* 来使用的。如果你直到*ppv的确切类型,直接调用它也是可以的。例如:
(IA*)*ppv->FA();

解决方案5:

一、好象CMy::QueryInterface实现不是这样的吧。
这里假设IA为第一个继承的接口。
class CMy : public IA, public IB
{};
HRESULT CMy::QuerInterface(const IID& iid, void**ppv)
{
        if(iid == IID_IUnknown)
        {
                *ppv = (IA*)this;//注意这里
                ((IA*)(*ppv))->AddRef();
        }
        else if(iid == IID_IA)
        {     
                *ppv = (IA*)this;
                ((IA*)(*ppv))->AddRef();
        else if(iid == IID_IB)
        {
                *ppv = (IB*)this;
                ((IB*)(*ppv))->AddRef();
        }
        else
        {
                *ppv = NULL;
                return E_NOINTERFACE;
        }
        return S_OK;   
}

解决方案6:

1 对于同一个对象的不同接口指针,查询得到的 IUnknown 接口必须完全相同。所以通过IA IB得到的IUnkown都是一个地址。这是COM接口的原则之一。

解决方案7:

1 不管转成什么类型,地址还是一样的。我不知道你怎么会认为*ppv的值会不同。
2 不行。
3 接口不是变量,不知道你是如何看到的。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 求<<com技术内幕>>的配书光盘
  • 求电子书-------<<COM原理与应用>>
  • 谁有<COM原理与应用>电子书,给小弟传一份!
  • 求<<InsideOLE>>中文版。
  • 求<<Atlinternals>>电子书
  • 如何用模板<class>实现一个树类型
  • 求<com技术内幕>英文版电子书,pdforchm,谢谢
  • 求<teechartv5开发资料>
  • ATL的CSimpleArray<>问题,愁死我啦
  • 为什么说CComQIPtr<IUnknown>是不合法的?

相关文章

  • 2017-06-04 DCOM中数组,指针传递问题?极度郁闷(高手请进,分不限)
  • 2017-06-04 用ATL做Activex,用_com_util::ConvertBSTRToString函数后,在release版中会报错?
  • 2017-06-05 这个函数怎么没有实现屏蔽Ctrl+Alt+Dele涅?
  • 2017-06-04 问下在VISTA中如何完成XP下的GINA相关功能?
  • 2017-06-05 急!!如何得到另一个进程中的一个线程的入口地址?
  • 2017-06-05 求大牛看看,richedit添加qq的imageoledll显示gif的时候闪烁的厉害。在线等
  • 2017-06-04 aboutshellextension
  • 2017-06-04 com是厉害,但是
  • 2017-06-04 如何获得多个Excel实例的接口???
  • 2017-06-04 C#导入COM组件

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • VS操作PPT时出现COleDispatchException
    • DirectX播放器与mfc框架播放器//会不一个效果?
    • 关于IE做ActiveX的容器不同之处问题
    • MFC调用第三方一卡通DLL崩溃异常,困惑中~~~
    • 如何将一个程序进行打包?
    • DShow代码分析适合filter有开发经验的人士1
    • 请教:如何获得调用CoInitializeExNULL,COINIT_MULTITHREADED后产生的隐含窗体的句柄,多谢!
    • com编程问题?
    • 想将一个命令行工程中的几个函数做成DLL文件,有什么简单的方法吗?
    • 注入用的dll写法有什么要注意的地方么

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有