口的实现基础是一个 DLL 进程外的接口则是建立在应用程序 , (EXE) 上的.通常我们建立进程外接口的目的主要是为了方便调试(跟踪 DLL 是件很 麻烦的事),然后在将代码改为进程内发布.因为进程内比进程外的执行效率会 高一些.(也就是先建立进程内的接口,再将其改为进程内发布.) COM 对象创建在服务器的进程空间.如果是 EXE 型服务器,那么服务器和客户 端不在同一进程;如果是 DLL 型服务器,则服务器和客户端就是一个进程.所 以进程内还能节省内存空间,并且减少创建实例的时间. StdCall 与 SafeCall Delphi 生成的 COM 接口默认的方法函数调用方式是 stdcall 而不
是缺省的 Register.这是为了保证不同语言编译器的接口兼容. 双重接口(在后面讲解自动化时会提到双重接口)中则默认的是 SafeCall.它的 意义除了按 SafeCall 约定方式调用外 还将封装方法以便向调用者返回 HResult , 值.SafeCall 的好处是能够捕获所有异常,即使是方法中未被代码处理的异常, 也可以被外套处理并通过 HResult 返回给调用者. WideString 等一些有差异的类型 接 口 定 义 中 缺 省 的 字 符 参 数 或 返 回 值 将 不 再 是 String 而 是 WideString . WideString 是 Delphi 中符合 OLE 32-bit 版本的 Unicode 类型,当是字符 时,WideString 与 String 几乎等同,当处理 Unicode 字符时,则会有很大差别. 联想到 COM 本身是为了跨平台使用,可以很容易的理解为什么数据通信时需要 使用 WideString 类型. 同样的道理,integer 类型将变成 SYSINT 或者 Int64,SmallInt 或者 Shortint, 这些细微的变化都是为了符合规范. 通过向导生成基础代码
打开创建新工程向导 (菜单"File-New-Other"或"New Items 按钮") ,选择 ActiveX 页.先建立一个 ActiveX Library.编译后即是个 DLL 文件(进程内).然后在 同样的页面再建立一个 COM Object. 接着你将看到如下向导,除了填写类名外(接口名会自动根据类名填充),创建 有 实例模式(Instancing)和线程模式(Threading Model)的选项.
实例模式->>决定客户端请求后,COM 对象如何创建实例: Internal:供 COM 对象内部使用,不会响应客户端请求,只能通过 COM 对象内 部的其他方法来建立; Single Instance:不论当前
系统内部是否存在相同 COM 对象,都会建立一个新 的程序及独立的对象实例; : , , Mulitple Instance 如果有多个相同的 COM 对象 只会建立一个程序 多个 COM 对象的实例共享公共代码,并拥有自己的数据空间. Single/ Mulitple Instance 有各自的优点,Mulitple 虽然节省了内存但更加费时. 即 Single 模式需要更多的内存资源,而 Mulitple 模式需要更多的 CPU 资源,且 Single 的实例响应请求的负荷较为平均.该参数应根据服务器的实际需求来考 虑.
线程模式有五种: Single:仅单线程,处理简单,吞吐量最低; Apartment:COM 程序多线程,COM 对象处理请求单线程; Free:一个 COM 对象的多个实例可以同时运行.吞吐量提高的同时,也要求对 COM 对象进行必要的保护,以避免多个实例冲突; Both:同时支持 Aartment 和 Free 两种线程模式. Neutral:只能在 COM+下使用. 虽然 Free 和 Both 的效率得到提高,但是要求较高的技巧以避免冲突(这是很 不容易调试的),所以一般建议使用 Delphi 的缺省方式.
类型库编辑器( 类型库编辑器(Type Library) )
假设我们建立一个叫做 TSample 的类和 ISample 的接口(如图),然后使用类 型库编辑器创建一个方法 GetCOMInfo(在右边树部分点击右键弹出 菜单选择 New-Meth
od 或者点击上方按钮),并于左边 Parameters 页面建立两 个参数(ValInt : Integer , ValStr : String),返回值为 BSTR.如图:
可以看到,除了
常用类型外,参数和返回值还可以支持很多指针,OLE 对象, 接口类型.建立普通的 COM 对象,其 Returen Type 是可以任意的, 这是和 DCOM 的一个区别. 双击 Modifier 列弹出窗口,可以选择参数的方式:in,out 分别对应 const,out 定义,选择 Has Def