- 1
- 0
- 约3.51千字
- 约 4页
- 2022-06-29 发布于上海
- 举报
如何通过 COM 接口得到实现该接口的对象实例
问题由来
我的程序为一个基于 COM 的插件结构,框架需要向插件传递一个 IResource 接口。IResource
需要根据不同的插件传递不同的内容。接口定义
IResource = Interface(IDispatch) Function GetPath: String; safecall;
End;
实现类
TResource = TClass(TAutoObject, IResource) protected
Function GetPath: String; SafeCall; Public
Path: String;
End;
Function GetPath: String; Begin
Result:= Path;
End;
调用部分:
Var
Resource: IResource; ResourceObj: TResource;
Begin
Resource:= CreateComObject(CLASS_Resource) As IResource;
//想通过强制转换得到 TResource;结果失败了:( ResourceObj:= TResource(Resource); ResourceObj.Path:= 这里设置不同的值;
End;
请问:
如何通过 IResource 得到 TResource,从而达到设置 PATH 值的目的?
目前我采用的方案是再定义一个 ISetValue 的接口修改里面的 PATH 属性,感觉用起来比较
麻烦。
问题的延伸
如果从解决问题出发,通过定义配置接口,如:
IObjRef = Interface
function GetObjRef: TObject; safecall; end;
这样得到对象,再对 PATH 赋值,这样做在没有破坏 COM 的封装,实现起来也比较清晰。
问题至此基本解决。
但本着从分析 DELPHI 对象与接口之间的关系的出发点,我们还是继续标题中提出的问题: 如何通过 COM 接口得到实现该接口的对象实例 ?
关于 DELPHI 中对象与接口之间在编译器实现的内存空间情况:
对象/接口指针 对象内存空间 虚方法表
MyObject
MyIntf
-
-
VMTptr FRefCount IInterface
FFieldA
00--------- VirtA 00
04 VirtB 04
08----
0C IInterface 跳转表
FFieldB
10 addr of QueryInterface
MyIntfB
-
IIntfB
14--------- addr of _AddRef
MyIntfA
-
IIntfA
18-- addr of _Release
IIntfB 跳转表
---- addr of ProcB
addr of VirtB
IIntfA 跳转表
----------- addr of ProcA
addr of VirtA
一个对象在调用类的成员函数的时候,比如执行 MyObject.ProcA,会隐含传递一个 Self 指针给这个成员函数:MyObject.ProcA(Self)。Self 就是对象数据空间的地址。那么编译器如何知道 Self 指针?原来对象指针 MyObject 指向的地址就是 Self,编译器直接取出MyObject^ 就可以作为 Self。
在以接口的方式调用成员函数的时候,比如 MyIntfA.ProcA,这时编译器不知道 MyIntfA 到底指向哪种类型(class)的对象,无法知道 MyIntfA 与 Self 之间的距离(实际上,在上面的例子中 Delphi 编译器知道 MyIntfA 与 Self 之间的距离,只是为了与 COM 的二进制格式兼容,使其它语言也能够使用接口指针调用接口成员函数,必须使用后期的 Self 指针修正),编译器直接把 MyIntfA 指向的地址设置为 Self。从上图可以看到,MyIntfA 指向
MyObject 对象空间中 $18 偏移地址。这时的 Self 指针当然是错误的,编译器不能直接调用 TMyObject.ProcA,而是调用 IIntfA 的“接口跳转表”中的 ProcA。“接口跳转表”中的ProcA 的内容就是对 Self 指针进行修正(Self - $18),然后再调用 TMyObject.ProcA,这时就是正确调用对象的成员函数了。由于每个类实现接口的顺序不一定相同,因此对于相同 的接口在不同的类中实现,就有不同的接口跳转表(当然,可能编辑器能够聪明地检查到一些类的“接口跳转表”偏移量相同,也可以共享使用)。
通过这里得到了解决问题的关键,如果能得到接口的偏移地址
您可能关注的文档
- 挑战杯创业计划书范本.docx
- 挑战杯心得体会.docx
- 挑战困难分析和总结.docx
- 条件概率综合测试题(含答案).docx
- 调标方法分析和总结.docx
- 调查报告的提纲.docx
- 调查方案调查报告及案例.docx
- 调查评议表分析和总结.docx
- 调查问卷方案设计.docx
- 调查问卷分析报告.docx
- 全过程工程管理造价咨询工程监理项目服务方案投标方案(技术部分).doc
- 招标代理服务投标技术服务方案(技术方案).doc
- AI大模型与AIGC技术在公安领域的应用解决方案(99页 PPT).pptx
- 工业4.0智能制造数字工厂规划方案.pptx
- 树立社会主义核心价值观.docx
- 三年(2023-2025)中考历史真题分类汇编(全国)专题21 科技文化与社会生活(解析版).docx
- 2025年中考道德与法治真题完全解读(吉林卷).pdf
- 2025年中考道德与法治真题完全解读(安徽卷).pdf
- 三年(2023-2025)中考历史真题分类汇编(全国)专题14 人民解放战争(解析版).pdf
- 三年(2023-2025)广东中考历史真题分类汇编:专题03 中国近代史(八年级上册)(解析版).docx
最近下载
- 安徽省芜湖市弋江区2023-2024学年六上数学期末统考模拟试题含答案.doc VIP
- 组织学和胚胎学泌尿系统.pdf VIP
- 2025年高性能复合材料在新能源储能设备中的应用研究报告.docx
- 医疗器械用复合材料市场分析报告:2025年现状与未来五到十年趋势展望.docx
- 《2025年工程机械行业复合材料应用前景分析报告》.docx
- GB∕T 40112-2021 地质灾害危险性评估规范.pdf
- 2025年海洋工程装备高性能复合材料研发与应用创新报告.docx
- 2025年中国睡眠研究报告.docx VIP
- 人教版三年级上册数学期末卷-小学数学三年级上册-期末复习试卷-人教版---.docx VIP
- 2025-2026学年高二物理期末模拟卷01【测试范围:人教版选必一+选必二】(考试版)(新高考通用).docx VIP
原创力文档

文档评论(0)