如何通过COM接口得到实现该接口的对象实例如何通过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接口得到实现该接口的对象实例 ? SAVETIME的线索http://www.delphibbs.com/delphibbs/dispq.asp?lid=2433841
SAVETIME的这篇文章中提到了关于DELPHI中对象与接口之间在编译器实现的内存空间情况: ----------------|-----------------|----------|--------------|----------------- 对象/接口指针 | 对象内存空间 | | 虚方法表 | ----------------|-----------------|----------|--------------|----------------- MyObject -> | VMTptr 00|--------->| VirtA 00| | FRefCount 04| | VirtB 04| MyIntf -> | IInterface 08|----| | FFieldA 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。 上一篇:如何接受消息,中断正在处理的过程 下一篇:Tchart分析报告 更多相关文章
|
推荐文章
精彩文章
·报表设计
|