发表于:2007-02-12 12:39:00
楼主
COM对于接口的定义和接口的实现作了严格的区分。通过下面的IUnknown接口可以知道,在接口中只有接口方法的描述,而没有实现。
COM接口可以分为以下两类:标准接口和自定义接口。COM接口的名字以字母I打头。COM定义了大量的标准接口。如IClassFactory、IDispatch、IUnknown等。其中IUnknown接口最重要,因为所有其它接口都是从IUnknown接口直接或间接继承而来的。IUnkown接口定义了三个方法。
HRESULT QueryInterface([in] REFIID riid,[out] void **ppv);
ULONG AddRef();
ULONG Release();
COM定义的每一个接口都必须从IUnkown接口继承过来,换句话说,任何在COM对象上实现的接口必须以QueryInterface、AddRef和Release为前三个方法。其原因在于IUnkown接口提供了两个非常重要的特性:生存期控制和接口查询。客户程序只能通过接口与COM对象进行通信,虽然客户程序可以不管对象内部实现的细节,但它要控制对象存在与否。如果客户还要继续对对象进行操作,则它必须保证对象一直存在于内存中;如果客户对对象的操作已经完成,以后也不再需要该对象了,则应该及时地把对象释放掉,以提高系统资源的利用率。
IUnkown接口中的AddRef()和Release()负责对象引用计数,实现组件对象生命周期的管理。每当COM组件被引用一次就应调用一次AddRef()方法。而当客户端在释放COM组件的某个接口时就需要调用Release()方法。
另外,如果一个COM对象实现了多个接口,在初始时刻客户程序不太可能得到该对象的所有接口指针,它只会拥有一个接口指针。如果客户程序需要其它的指针,则利用IUnkown接口中的QueryInterface()方法是用于查询组件对象所实现的其它接口。
有关OPC服务器对象的COM接口定义如下:
IUnknown接口是所有COM对象必须实现的最基本接口。其它接口都派生于IUnknown接口。在第二章已经讲过IUnknown接口的成员函数。
IOPCCommon接口被应用于各种类型的服务器(例如:OPC报警与事件服务器),它们共享这个接口设计。它提供设置和查询LocaleID(本地语言标识)的功能,对特定的客户/服务器交互有效,也就是说,一个客户的行为不会影响其它客户。
IOPCServer接口是OPC服务器对象的主要接口,它可完成组对象的动态创建、删除、枚举和获得当前状态等操作并对其进行管理。服务器对象必须提供此接口。
IConnectionPointContainer接口主要提供了IOPCShutdown的出接口连接点访问支持。IOPCShutdown出接口用于服务器主动与客户程序断开连接时对客户程序进行通知。OPC服务器必须支持此接口。它的实现与一般连接点对象的实现相同。
IOPCServerPublicGroups、IPersistFile和IOPCBrowseServerAddressSpace为可选接口,OPC服务器提供商可根据需要选择是否需要实现。其中IOPCServerPublicGroups接口用于公共组进行管理。IPersistFile接口允许用户装载和保存服务器的设置,这些设置包括服务器通信的波特率、现场设备的地址和名称等。这样用户就可以知道服务器启动和配置的改变而不需要启动其它的程序。IOPCBrowseServerAddressSpace允许用户浏览服务器中有用组(项)的数据,为用户提供OPC服务器各个组的定义列表。
有关OPC组对象的COM接口定义如下:
IOPCItemMgt接口及其成员函数的功能是允许OPC客户程序添加和删除项对象并可控制项对象的行为。
IOPCGroupStateMgt接口及其成员函数允许客户程序管理组对象的所有状态。最基本的是改变组对象的更新率和活动状态。
IOPCPublicGroupStateMgt为可选接口,用于将私有组对象转换成公共组对象,因为当客户创建一个组对象时,被初始化为私有组对象。
IOPCSyncIO接口允许客户对服务器执行同步读写操作。操作将一直运行到完成才返回。
IOPCAsyncIO2接口允许客户对服务器执行异步读写操作,操作被“排队等候”,函数立即返回。每项操作被看作一个“事务”,并被分配一个事务ID,当操作完成时,客户IOPCDataCallback接口的回调将执行。回调中的信息指出了事务ID和操作结果。这两个是数据访问规范进行数据访问的最重要接口。
IConnectionPointContainer接口:组对象必须实现此接口,与服务器对象的此接口的唯一区别是管理的出接口不一样,组对象管理的出接口是IOPCDataCallback接口,可使客户与服务器连接并进行最有效的数据传送。
IOPCAsyncIO(old)接口是数据存取规范1.0必须实现的接口之一,按照程序兼容规则,符合规范2.02的服务器也应该实现规范1.0的必选接口。IOPCASynCIO接口允许客户对服务器执行异步读写操作,其行为与IOPCAsyncI02类似,可参考IOPCAsyncI02,只是操作完成后结果是由IAdviseSink的回调返回给客户。
IDataobject(old)接口是OPC规范1.0需要服务器实现的接口,这允许使用OPC数据流格式创建客户与组对象之间的Advise连接,用于进行高效的数据交换。