Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->编程语言 ->Delphi ->正文

如何通过COM接口得到实现该接口的对象实例

来源:Linuxdby.com 作者:Webmaster 时间:2007-06-05 点击: [收藏] [投稿]
如何通过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分析报告

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号