System单元对所有与COM相关的声明就这么多,需要倒背如流
是首先是VM表,但是和COM相关的函数地址都废弃了,这几个VM函数具体放在哪里,还得在研究:
- { Virtual method table entries }
- vmtSelfPtr = -;
- vmtIntfTable = -;
- vmtAutoTable = -;
- vmtInitTable = -;
- vmtTypeInfo = -;
- vmtFieldTable = -;
- vmtMethodTable = -;
- vmtDynamicTable = -;
- vmtClassName = -;
- vmtInstanceSize = -;
- vmtParent = -;
- vmtSafeCallException = - deprecated; // don't use these constants.
- vmtAfterConstruction = - deprecated; // use VMTOFFSET in asm code instead
- vmtBeforeDestruction = - deprecated;
- vmtDispatch = - deprecated;
- vmtDefaultHandler = - deprecated;
- vmtNewInstance = - deprecated;
- vmtFreeInstance = - deprecated;
- vmtDestroy = - deprecated;
- vmtQueryInterface = deprecated;
- vmtAddRef = deprecated;
- vmtRelease = deprecated;
- vmtCreateObject = deprecated;
其次是所有与COM相关的声明与定义:
- type
- TObject = class;
- TClass = class of TObject;
- HRESULT = type Longint; { from WTYPES.H }
- {$EXTERNALSYM HRESULT}
- PGUID = ^TGUID;
- TGUID = packed record
- D1: LongWord;
- D2: Word;
- D3: Word;
- D4: array[..] of Byte;
- end;
- PInterfaceEntry = ^TInterfaceEntry;
- TInterfaceEntry = packed record
- IID: TGUID;
- VTable: Pointer;
- IOffset: Integer;
- ImplGetter: Integer;
- end;
- PInterfaceTable = ^TInterfaceTable;
- TInterfaceTable = packed record
- EntryCount: Integer;
- Entries: array[..] of TInterfaceEntry;
- end;
- TMethod = record
- Code, Data: Pointer;
- end;
- const
- S_OK = ; {$EXTERNALSYM S_OK}
- S_FALSE = $; {$EXTERNALSYM S_FALSE}
- E_NOINTERFACE = HRESULT($); {$EXTERNALSYM E_NOINTERFACE}
- E_UNEXPECTED = HRESULT($8000FFFF); {$EXTERNALSYM E_UNEXPECTED}
- E_NOTIMPL = HRESULT($); {$EXTERNALSYM E_NOTIMPL}
- type
- IInterface = interface
- ['{00000000-0000-0000-C000-000000000046}']
- function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
- function _AddRef: Integer; stdcall;
- function _Release: Integer; stdcall;
- end;
- IUnknown = IInterface;
- {$M+}
- IInvokable = interface(IInterface)
- end;
- {$M-}
- IDispatch = interface(IUnknown)
- ['{00020400-0000-0000-C000-000000000046}']
- function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
- function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
- function GetIDsOfNames(const IID: TGUID; Names: Pointer;
- NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
- function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
- Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
- end;
- {$EXTERNALSYM IUnknown}
- {$EXTERNALSYM IDispatch}
- { TInterfacedObject provides a threadsafe default implementation
- of IInterface. You should use TInterfaceObject as the base class
- of objects implementing interfaces. }
- TInterfacedObject = class(TObject, IInterface)
- protected
- FRefCount: Integer;
- function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
- function _AddRef: Integer; stdcall;
- function _Release: Integer; stdcall;
- public
- procedure AfterConstruction; override;
- procedure BeforeDestruction; override;
- class function NewInstance: TObject; override;
- property RefCount: Integer read FRefCount;
- end;
- TInterfacedClass = class of TInterfacedObject;
- { TAggregatedObject and TContainedObject are suitable base
- classes for interfaced objects intended to be aggregated
- or contained in an outer controlling object. When using
- the "implements" syntax on an interface property in
- an outer object class declaration, use these types
- to implement the inner object.
- Interfaces implemented by aggregated objects on behalf of
- the controller should not be distinguishable from other
- interfaces provided by the controller. Aggregated objects
- must not maintain their own reference count - they must
- have the same lifetime as their controller. To achieve this,
- aggregated objects reflect the reference count methods
- to the controller.
- TAggregatedObject simply reflects QueryInterface calls to
- its controller. From such an aggregated object, one can
- obtain any interface that the controller supports, and
- only interfaces that the controller supports. This is
- useful for implementing a controller class that uses one
- or more internal objects to implement the interfaces declared
- on the controller class. Aggregation promotes implementation
- sharing across the object hierarchy.
- TAggregatedObject is what most aggregate objects should
- inherit from, especially when used in conjunction with
- the "implements" syntax. }
- TAggregatedObject = class(TObject)
- private
- FController: Pointer; // weak reference to controller
- function GetController: IInterface;
- protected
- { IInterface }
- function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
- function _AddRef: Integer; stdcall;
- function _Release: Integer; stdcall;
- public
- constructor Create(const Controller: IInterface);
- property Controller: IInterface read GetController;
- end;
- { TContainedObject is an aggregated object that isolates
- QueryInterface on the aggregate from the controller.
- TContainedObject will return only interfaces that the
- contained object itself implements, not interfaces
- that the controller implements. This is useful for
- implementing nodes that are attached to a controller and
- have the same lifetime as the controller, but whose
- interface identity is separate from the controller.
- You might do this if you don't want the consumers of
- an aggregated interface to have access to other interfaces
- implemented by the controller - forced encapsulation.
- This is a less common case than TAggregatedObject. }
- TContainedObject = class(TAggregatedObject, IInterface)
- protected
- { IInterface }
- function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
- end;
里面的英文说明还得翻译如下:
System单元对所有与COM相关的声明就这么多,需要倒背如流的更多相关文章
- SQLite 对中文路径的支持(用到了StringToWideChar和Utf8Encode在D7的System单元中自带)
最近用SQLITE作为数据库,发现,如果直接传递带中文路径或文件名的数据库,会导致无法打开数据库的情况.看了一下SQLITE的源码,才发现,原来SQLITE中是用UTF8编码进行文件打开操作的. 所以 ...
- IIS 无法读取配置节"system.web.extensions",由于它缺少节声明
作者:jiankunking 出处:http://blog.csdn.net/jiankunking 今天在本地安装iis.搭建站点,应用程序的时候报错以下的错误: server错误 Internet ...
- .net学习笔记----利用System.Drawing.Image类进行图片相关操作
C#中对图片的操作主要是通过System.Drawing.Image等类进行. 一.将图片转换为字节流 /// <summary> /// 图片处理帮助类 /// </summary ...
- Delphi数组复制(只能使用System单元的Move函数)
const AA : arrary[..] ,,,,) var BB : arrary[..] of byte; begin BB := AA ; {这样是错误的} Move(AA,BB,sizeof ...
- Delphi “Invalid floating point operation.”错误的解决方法(使用System单元提供的Set8087CW函数禁用浮点异常)
这两天用webbrower写东西,有时候打开SSL加密网站时会出现”Invalid floating point operation.”的错误,上网搜了下,把解决方法贴上. 导致原因 在Delphi2 ...
- 单击Gridview中LinkButton,获取当前行索引及某单元格值,进行相关处理
1.在Gridview中添加模板列,在其中加入Linkbuttion,增加CommandName属性 (设置命令名),并赋值 <asp:TemplateField HeaderText=&quo ...
- 使用http.sys,让delphi 的多层服务飞起来
核心提示:一直以来,delphi 的网络通讯层都是以indy 为主,虽然indy 的功能非常多,涉及到网络服务的各个方面,但是对于大多数多层服务来说,就是需要一个快速.稳定.高效的传输层.Delphi ...
- linux基础-基本命令的讲解(1-7单元)
基本命令的讲解 主要内容介绍 1.LINUX操作系统安装及初始化配置(熟悉):2.LINUX操作系统目录组成结构及文件级增删改查操作(重点):3.LINUX操作系统用户.权限管理(重点):4.开源软件 ...
- Delphi XE5教程7:单元引用和uses 子句
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
随机推荐
- VS2010 安装 Boost 库 1.54
Boost库被称为C++准标准库, 功能很是强大, 下面记录我在VS2010中安装使用Boost库的过程. 首先上官网http://www.boost.org/下载最新的Boost库, 我的版本是1_ ...
- hdu 1102 Constructing Roads(最小生成树 Prim)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Problem Description There are N villages, which ...
- Swift - 获取字符串的MD5值
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现. ...
- 利用d3.js绘制中国地图
d3.js是一个比較强的数据可视化js工具. 利用它画了一幅中国地图,例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3ZhcDE=/ ...
- Delphi XE7下如何创建一个Android模拟器调试
利用Delphi XE7我们可以进行多种设备程序的开发,尤其是移动开发应用程序得到不断地加强.在实际的Android移动程序开发中,如果我们直接用android真机直接调试是非常不错.一是速度快,二是 ...
- Project configuration is not up-to-date with pom.xml错误解决方法
导入一个Maven项目之后发现有一个如下的错误: Project configuration is not up-to-date with pom.xml. Run project configura ...
- Java_1Lesson
cmd使用 进入硬盘分区:D: E: F: 查看目录 dir 进入文件夹 “cd 文件名” .使用javac编译器编译运行. Javac 文件名 运行java程序 Java 文件名 第一个程序 pub ...
- POJ 1042 Gone Fishing (贪心)(刘汝佳黑书)
Gone Fishing Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 30281 Accepted: 9124 Des ...
- Android播放音乐时跳动的屏谱demo
Android实现播放音频时的跳动频谱,并实现可以调节的均衡器. Main.java package com.wjq.audiofx; import android.app.Activity; imp ...
- net core与golang web
Asp.net core与golang web简单对比测试 最近因为工作需要接触了go语言,又恰好asp.net core发布RC2,就想简单做个对比测试. 下面是测试环境: CPU:E3-1230 ...