• 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本质论》p58页的宏是什么意思

高手给我解释一下《com本质论》p58页的宏是什么意思

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

佚名通过本文主要向大家介绍了4381.com高手联盟,400444.com高手联盟,4380.com高手联盟,90888.com九龙高手,0820com九龙高手论坛等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 高手给我解释一下《com本质论》p58页的宏是什么意思
描述:

#define BASE_OFFSET(ClassName,BaseName) \
(DWORD ( static_cast<BaseName*> (reinterpret_cast\
<ClassName*> (0x1000000))) - 0x1000000)
#define BEGIN_INTERFACE_TABLE(ClassName) \
typedef ClassName_ITCls; \
const INTERFACE_ENTRY *GetInterfaceTable(void) {\
     static const INTERFACE_ENTRY table[]={\
#define IMPLEMENTS_INTERFACE(Itf) \
{&IID_##Itf, ENTRY_IS_OFFSET,BASE_OFFSET(_ITCls, Itf) },
#define IMPLEMENTS_INTERFACE_AS(req,Itf) \
{&IID_##req, ENTRY_IS_OFFSET, BASE_OFFSET(_ITCls, Itf) },
#define END_INTERFACE_TABLE() \
          {0, 0, 0 } }; return table; }
其中INTERFACE_ENTRY的定义如下:
typedef struct _INTERFACE_ENTRY
{
     const IId*       pIID;
     INTERFACE_FINDER pfnFinder;
     DWORD            dwData;
} INTERFACE_ENTRY;
上一个结构中的INTERFACE_FINDER 的定义为:
typedef HRESULT (*INTERFACE_FINDER) (void *pThis,DWORD dwData,REFIID riid,void **ppv);
#define ENTRY_IS_OFFSET INTERFACE_FINDER(-1)   //这句话又是什么意思?


解决方案1:

定义INTERFACE_ENTRY表用于查找IID:
BASE_OFFSET宏:获取接口在实现类中的偏移;
BEGIN_INTERFACE_TABLE(ClassName)
   IMPLEMENTS_INTERFACE(Itf)
END_INTERFACE_TABLE()
三个宏定义GetInterfaceTable函数,并填充INTERFACE_ENTRY表。
如此操作是实现类似于MFC的表格驱动模型。将QueryInterface函数的操作委托给内部表格查找函数
InnerFindInterface,再由InnerFindInterface调用GerInterfaceTable获得接口表,遍历表格中的pIID,根据表项中的
INTERFACE_FINDER指针判定是否有另外的查找函数或是直接取得接口指针(Itf *)(this + dwData(偏移量))。

解决方案2:

混分

解决方案3:

好久没有回帖!我来说两句!
首先,1、typedef HRESULT (*INTERFACE_FINDER) (void *pThis,DWORD dwData,REFIID riid,void **ppv);
#define ENTRY_IS_OFFSET INTERFACE_FINDER(-1)   //这句话又是什么意思?
意思是宏ENTRY_IS_OFFSET的值为INTERFACE_FINDER类型并且它的指针值是-1,也就是地址是0xfffffff
,具体的意思是为了表明接口映射表中某个接口是偏移的。
2、#define BASE_OFFSET(ClassName,BaseName) \
(DWORD ( static_cast<BaseName*> (reinterpret_cast\
<ClassName*> (0x1000000))) - 0x1000000)
这个宏是偏移量,它是先用reinterpret_cast<ClassName*>强制转换一个地址0x1000000为ClassName*的指针地址,接着再用static_cast<BaseName*> 转换成基类(其实是接口)指针减去原始地址计算出固定偏移量。不知道我说清楚了没有,如果你对static_cast和reinterpret_cast强制转换不太了解那么就去查一下!
3、BEGIN_INTERFACE_TABLE 意思就是初始化一个表,我想可能是老侯翻译的时候漏掉了一点代码我这里没法明确的解释,如果你想知道的更具体我建议你去看看atl的实现,哈哈!以为我喜欢atl!
4、#define IMPLEMENTS_INTERFACE(Itf) \
{&IID_##Itf, ENTRY_IS_OFFSET,BASE_OFFSET(_ITCls, Itf) }.....
意思就是添加一条记录到表中!格式就是{&IID_##Itf, ENTRY_IS_OFFSET,BASE_OFFSET(_ITCls, Itf) }
5、#define END_INTERFACE_TABLE() \
          {0, 0, 0 } }; return table; }这个就不用解释了!一看就知道!hoho!

解决方案4:

#define ENTRY_IS_OFFSET INTERFACE_FINDER(-1)   //这句话又是什么意思?
因它COM的结口映射实现上就是维护的一张表,-1表示这张表到此结束。

解决方案5:

#define ENTRY_IS_OFFSET INTERFACE_FINDER(-1) 
就是说这个函数此处没有用它,把它置为-1 啦!
INTERFACE_FINDER(-1) 是把-1转换为INTERFACE_FINDER类型函数指针,以防类型不匹配报错!


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

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

  • COM高手请教
  • 关于取消com同步调用的问题,高手进
  • 高手请进:关于COM+在网络环境下的实现
  • 各位COM高手,可以到这里来看看小妹的问题哟
  • 高手们能不能给指条明道?com问题(分不是问题)
  • 请com高手帮忙,如何把一个DLL转成标准的COM组建???
  • com高手求救呀--com函数返回值不要返回宽字符呀?
  • 急~Com高手請進
  • 对于Com的unknowh中的一些代码看得不是很清楚,麻烦高手不惜赐教
  • 关于COM的问题--高手请进来看看啊

相关文章

  • 2017-06-04 为什么这个MFC做的控件在客户端无法使用??
  • 2017-06-04 急,请问为何CDialog设为child后调用ocx出错,异怪
  • 2017-06-05 请问哪里有wtsapi32h可以下载?
  • 2017-06-04 怎么MFC程序中修改网页表单的值?200分求源程序
  • 2017-06-04 请问vc++的程序和word连上,使程序能够查找替换word中的关键字,有什么函数,怎么用啊?
  • 2017-06-05 VS2010+Win7在添加Activex控件中的mfc类的时候,没有WMP可选!
  • 2017-06-04 请问各位前辈怎样拿CPreviewView做控件的基类,高分送上。
  • 2017-06-04 浏览器栏的位置是怎么确定的?
  • 2017-06-05 如何在DLL中自己调用对话框?100分送
  • 2017-06-05 用api写个简单Com组件,除了用idl定义接口并实现以外,编译选项有什么需要考虑的?

文章分类

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

最近更新的内容

    • activeX添加工具栏
    • 求InsideCOM+BaseServices中文电子版
    • 一个有关DLL中如何封装类的问题,欢迎高手进来讨论!!!
    • 如何动态地在网页中插入AtlActivex控件?来者有分!
    • 我想学习IDL语言,有什么好书或网址推荐?
    • webgis
    • 我想在多个线程里通过ADO操作数据库。可是。。。
    • 请问一个如何使一段程序要么运行,要么都不运行?
    • winsock实现工控机和plc之间的通信
    • 怎么用VC编写ZPLii语言

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

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