收藏 分享(赏)

ole编程技术.doc

上传人:hwpkd79526 文档编号:6628402 上传时间:2019-04-18 格式:DOC 页数:12 大小:238KB
下载 相关 举报
ole编程技术.doc_第1页
第1页 / 共12页
ole编程技术.doc_第2页
第2页 / 共12页
ole编程技术.doc_第3页
第3页 / 共12页
ole编程技术.doc_第4页
第4页 / 共12页
ole编程技术.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、1OLE 的基础COM (Component Object Model)一Windows 软件开发中的接口演变在一个操作系统平台上运行的应用软件可能是由不同的开发工具开发出来的。当彼此需要调用时就必须有一套标准的接口规范来统一开发过程。Windows 软件接口的发展APIApplication Programming Interface适用于用 C 和 C+语言开发的非对象化结构的软件接口。VBXVisual Basic Exchange适用于用 VB 开发的软件接口。DLLDynamic Data Libraries适用于用多种开发工具开发出来的以成为机器目标指令级的半成品软件接口。但有同位

2、限制,即 32 位32 位、16 位16 位。OLE Object-Linking Embedded 接口基于 COM 接口规范制定的面向对象的软件接口。不用考虑对方是用何种开发工具开发的;允许对方正在运行(进程或线程) ;允许不同位的系统互动;XMLXML(Extensible Markup Language) 扩展置标语言由万维网联盟(W3C)带头, XML 在 1998 年 2 月 10 日成为正式的规范。XML 在 Web 的真正实力在于是如何与文档对象模型(Document Object Model,DOM)交互的功能。目前这个接口还在2发展当中。二COM 体系结构需求当要与一个正在

3、运行的对象应用进行互动时,并不需要知道其内部类的结构而只要一个能与对象互连的但又是非对象的中间件来连Client Server接双方即可。如对一个正在太空中飞行的太空船,所希望的中间件软件是获得当前的位置(GetPosition() )和控制飞行姿态( Fly()) 。COM 体系标准由 Brock.Schmilt 博士于 1992 年提出。他用 struct 语句作为COM 体系的基本描述体,利用继承或透明包容结构实现中间件与对象的连接。 单一中间件模型多以继承关系实现。例:太空船的中间件结构struct IMotionvirtual intvirtual void fly()=0;clas

4、s CSpaceShip:public IMotion3public:CspaceShip();intvoid Fly();多重中间件模型多以继承和透明包容的混合关系实现。例:在上例基础上若增加一个实时的可视化的显示飞行轨迹的接口struct IMotionvirtual intvirtual void fly()=0;class Xmotion:public IMotionpublic:XMotion();virtual intvirtual void GetPosition();class XVisual:public IMotionpublic:virtual void Display(

5、);class CspaceShippublic:4XMotion m_rxmotion;XVisual m_xvisual;将上述的混合结构又称为嵌入式集合类。COM 模型(一) 抽象结构a、b 、x 实际上是嵌入式集合类中的一个被包容对象,具有明确的标识(即由于其名字是显然的,便可用一个句柄数字来代表) ;(二)中间件接口函数的标准Bool QueryInterface(const long包容类 ID 被包容类 ID 嵌入对象的指针(回写)例:通过对象 ID 获取嵌入对象的指针#include#includestruct COMvirtual int GetOne()=0; virtua

6、l int GetSecond()=0;class A:public COMint i;IUnkownOLEServerObjctabx 唯 一 的 公 共 接 口a、 b、 x均 是 由IUnkown派 生 出来 的 独 立 的 具 体应 用 的 软 件 接 口COMA BC5public:A():i(0)int GetOne()return i;int GetSecond()return i+1;class B:public COMint i;public:B():i(0)int GetOne()return i-1;int GetSecond()return i+2;class CCOM

7、 *IUnknown2;public:A pa;B pb;C()IUnknown0=IUnknown1=COM* Query(int x)return IUnknownx;C c;int (COM:*Get)()=void QueryObject(const intvoid main()A *ObjA;B *ObjB;QueryObject(0,(void*)/获取第一个嵌入对象地址cout*Get0)()*Get1)()#includeclass A;class Bint j;A *pa;public:B();int getAdata();int getdata();class A int

8、i;B *pb;public:B ab;A(int x):i(x)pb=(B*)(char*)this)+offsetof(A,ab);/注意int getdata()return i;B* getB()return pb;B:B()7pa=(A*)(char*)this)-offsetof(A,ab);/注意j=(pa)-getdata()+1;int B:getAdata()return pa-getdata();int B:getdata()return j;void main()A mya(10);coutgetdata()#include#include /为了使 MFC 的数据类型

9、有效(如 BOOL)struct COMvirtual int GetOne()=0;virtual int GetSecond()=0;class A:public COMint i;public:A():i(0)int GetOne()return i;int GetSecond()return i+1;class B:public COMint i;public:B():i(0)int GetOne()return i-1;int GetSecond()return i+2;class CCOM *IUnknown2;9public:A pa;B pb;C()IUnknown0=IUnk

10、nown1=virtual C()/注意务必在此插入虚拟析构函数COM* Query(int x)return IUnknownx;virtual BOOL QueryInterface(const intreturn TRUE;/为了简洁,没有插入有关 id 的判断和处理。;class D:public COM /类厂BOOL m_dwref;public:D():m_dwref(1)virtual BOOL QueryInterfeace(const intvirtual BOOL AddRef()return TRUE;virtual BOOL Release(COM* x)delete

11、 x;return TRUE;virtual BOOL CreateInstance(const intreturn m_current-QueryInterface(id,ppvobj);/为了简洁,没有插入有关 id 的判断和处理。/插入以下两个函数是为了避免本类成为抽象类virtual int GetOne()return 0;virtual int GetSecond()return 0;D d;int (COM:*Get)()=void QueryObject(C* obj,const intvoid main()10A *ObjA;B* ObjB;C *ObjC;d.CreateI

12、nstance(0,(void*)QueryObject(ObjC,0,(void*)cout*Get0)()*Get1)()endl;cin.get();d.Release(COM*)ObjC);计数与析构COM 接口的 Server 一侧常用计数器来统计来访问的 Client 的数目,于是定义一个默认的专用函数 AddRef()完成此任务。而默认的计数器的成员变量名为 m_dwref(初值为 1) 。COM 接口的 Server一侧内嵌入的所有对象类中都定义了虚拟析构函数,并在 COM 接口安排了一个名为 Release()的函数用以完成对嵌入对象的析构工作。MFC 的 COM 结构在 M

13、FC 中的 IUnknown 结构体是被编译成目标格式置于二进制库内并以公共成员的形式被声明在 CCmdTarget 类中的。因此,CCmdTarget 类便成为典型的类厂结构。在设计对象化的 COM 结构的应用时,只要以该类为基类而派生获得的任何类都可能成为类厂类。有关 CCmdTarget 类内的类厂结构的声明如下:class CCmdTarget : public Cobject/ OLE interface map implementation11public:/ data used when CCmdTarget is made OLE awarelong m_dwRef;LPUNK

14、NOWN m_pOuterUnknown; / external controlling unknown if != NULL/此前有声明:typedef struct IUnknown* LPUNKNOWN;DWORD m_xInnerUnknown; / place-holder for inner controlling unknownpublic:/ advanced operationsvoid EnableAggregation(); / call to enable aggregationvoid ExternalDisconnect(); / forcibly disconne

15、ctLPUNKNOWN GetControllingUnknown();/ get controlling IUnknown for aggregate creation/ these versions do not delegate to m_pOuterUnknownDWORD InternalQueryInterface(const void*, LPVOID* ppvObj);DWORD InternalAddRef();DWORD InternalRelease();/ these versions delegate to m_pOuterUnknownDWORD ExternalQ

16、ueryInterface(const void*, LPVOID* ppvObj);DWORD ExternalAddRef();DWORD ExternalRelease();/ implementation helpersLPUNKNOWN GetInterface(const void*);LPUNKNOWN QueryAggregates(const void*);/ advanced overrideables for implementationvirtual BOOL OnCreateAggregates();virtual LPUNKNOWN GetInterfaceHook

17、(const void*);;类标识 ID12对于静态的嵌入式集合类的类标识的定义比较容易实现(如可以在类厂类中使用 switch-case 结构或指针型函数的技术) 。而在多任务、多进程的 Windows 操作系统中当类厂对象一旦已经运行之后,自动获得类标识 ID 将成为困难的要求。为此,Windows 操作系统在系统环境数据库(常被称为注册表)内开辟了一个名为HKEY_CLASSES_ROOT 的组项专门用来存放满足下述情形的Server 类标识 ID:以 Setup 方式安装的且尚未从系统中删除(即)的含有类厂支持的应用软件的类标识;非 Setup 方式安装的第一次运行的含有类厂支持的应

18、用软件的类标识;软件系统直接修改注册表而被强制记录的类厂支持的应用软件的类标识(如 COleObjectFactory:UpdateRegistryAll 函数,注:COleObjectFactory 是 CCmdTarget 的派生类) ;为了简化 COM 接口的设计,MFC 还提供了专用的宏来定义接口。如前面提到的太空船的接口便可定义如下:BEGIN_INTERFACE_MAP(CSpaceship,CCmdTarget)INTERFACE_PART(CSpaceship,IID_Imotion,Motion)INTERFACE_PART(CSpaceship,IID_Ivisual,Visual)END_INTERFACE_MAP()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报