ole编程技术.doc_第1页
ole编程技术.doc_第2页
ole编程技术.doc_第3页
ole编程技术.doc_第4页
ole编程技术.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

OLE的基础COM(Component Object Model)一Windows软件开发中的接口演变在一个操作系统平台上运行的应用软件可能是由不同的开发工具开发出来的。当彼此需要调用时就必须有一套标准的接口规范来统一开发过程。Windows 软件接口的发展APIApplication Programming Interface适用于用C和C+语言开发的非对象化结构的软件接口。VBXVisual Basic Exchange适用于用VB开发的软件接口。DLLDynamic Data Libraries适用于用多种开发工具开发出来的以成为机器目标指令级的半成品软件接口。但有同位限制,即32位32位、16位16位。OLEObject-Linking Embedded接口基于COM接口规范制定的面向对象的软件接口。不用考虑对方是用何种开发工具开发的;允许对方正在运行(进程或线程);允许不同位的系统互动;XMLXML(Extensible Markup Language) 扩展置标语言由万维网联盟(W3C)带头, XML在1998年2月10日成为正式的规范。XML在Web的真正实力在于是如何与文档对象模型(Document Object Model,DOM)交互的功能。目前这个接口还在发展当中。二COM体系结构需求当要与一个正在运行的对象应用进行互动时,并不需要知道其内部类的结构而只要一个能与对象互连的但又是非对象的中间件来连ClientServer接双方即可。如对一个正在太空中飞行的太空船,所希望的中间件软件是获得当前的位置(GetPosition())和控制飞行姿态(Fly())。COM体系标准由Brock.Schmilt博士于1992年提出。他用struct语句作为COM体系的基本描述体,利用继承或透明包容结构实现中间件与对象的连接。 单一中间件模型多以继承关系实现。例:太空船的中间件结构struct IMotionvirtual int& GetPosition()=0;virtual void fly()=0;class CSpaceShip:public IMotionpublic:CspaceShip();int& GetPosition();void Fly();多重中间件模型多以继承和透明包容的混合关系实现。例:在上例基础上若增加一个实时的可视化的显示飞行轨迹的接口struct IMotionvirtual int& GetPosition()=0;virtual void fly()=0;class Xmotion:public IMotionpublic:XMotion();virtual int& GetPosition();virtual void GetPosition();class XVisual:public IMotionpublic:virtual void Display();class CspaceShippublic:XMotion m_rxmotion;XVisual m_xvisual;将上述的混合结构又称为嵌入式集合类。COM模型(一) 抽象结构a、b 、x实际上是嵌入式集合类中的一个被包容对象,具有明确的标识(即由于其名字是显然的,便可用一个句柄数字来代表);(二)中间件接口函数的标准Bool QueryInterface(const long&,const long&,void*);包容类ID被包容类ID嵌入对象的指针(回写)例:通过对象ID获取嵌入对象的指针#include#includestruct 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;public:A pa;B pb;C()IUnknown0=&pa;IUnknown1=&pb;COM* Query(int x)return IUnknownx;C c;int (COM:*Get)()=&COM:GetOne,&COM:GetSecond;void QueryObject(const int& x,void *anyobj)*anyobj=c.Query(x);void main()A *ObjA;B *ObjB;QueryObject(0,(void*)&ObjA);/获取第一个嵌入对象地址cout*Get0)()endl;QueryObject(1,(void*)&ObjB); /获取第二个嵌入对象地址cout*Get1)()endl;(三)嵌入式集合类内嵌入对象地址的获取方法实际的嵌入式集合类内部的结构是很复杂的(嵌入对象通常是无名的),嵌入对象地址的获取通常要通过计算其相对偏移的方法才能得到。例:#include#includeclass A;class Bint j;A *pa;public:B();int getAdata();int getdata();class A int 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()pa=(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()endl; coutmya.getdata()endl;类厂(Class Factory)嵌入式集合类对象通常不可能始终处于工作状态,而往往是在需要时才被临时激活的。当客户方并不知道嵌入式集合类的类名时也就不可能去执行其相应的构造函数。此时预先激活一个继承了公共接口(IUnknown)的派生类对象,并由其负责动态的生成所需的嵌入对象的工作。故此将支持这种功能结构的类称为类厂。类厂类中含有一套动态建立和撤消嵌入对象的成员函数用来实现上述功能。其结构描述如下:class IClassFactory:public IUnknownpublic:virtual BOOL CreatInstance(const long&,void*)=0;virtual DWORD Release()=0;例:#include#include#include/为了使MFC的数据类型有效(如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;public:A pa;B pb;C()IUnknown0=&pa;IUnknown1=&pb;virtual C()/注意务必在此插入虚拟析构函数COM* Query(int x)return IUnknownx;virtualBOOLQueryInterface(constint&id,void* obj)*obj=this;return TRUE;/为了简洁,没有插入有关id的判断和处理。;class D:public COM/类厂BOOL m_dwref;public:D():m_dwref(1)virtual BOOL QueryInterfeace(const int& id,void* ppvobj)return TRUE;virtual BOOL AddRef()return TRUE;virtual BOOL Release(COM* x)delete x;return TRUE;virtual BOOL CreateInstance(const int& id,void* ppvobj)C* m_current=new C;return m_current-QueryInterface(id,ppvobj);/为了简洁,没有插入有关id的判断和处理。/插入以下两个函数是为了避免本类成为抽象类virtual int GetOne()return 0;virtual int GetSecond()return 0;D d;int (COM:*Get)()=&COM:GetOne,&COM:GetSecond;void QueryObject(C* obj,const int& x,void *anyobj)*anyobj=obj-Query(x);void main()A *ObjA;B* ObjB;C *ObjC;d.CreateInstance(0,(void*)&ObjC);QueryObject(ObjC,0,(void*)&ObjA);cout*Get0)()endl;QueryObject(ObjC,1,(void*)&ObjB);cout*Get1)()endl;cin.get();d.Release(COM*)ObjC);计数与析构COM接口的Server一侧常用计数器来统计来访问的Client的数目,于是定义一个默认的专用函数AddRef()完成此任务。而默认的计数器的成员变量名为m_dwref(初值为1)。COM接口的Server一侧内嵌入的所有对象类中都定义了虚拟析构函数,并在COM接口安排了一个名为Release()的函数用以完成对嵌入对象的析构工作。MFC的COM结构在MFC中的IUnknown结构体是被编译成目标格式置于二进制库内并以公共成员的形式被声明在CCmdTarget类中的。因此,CCmdTarget类便成为典型的类厂结构。在设计对象化的COM结构的应用时,只要以该类为基类而派生获得的任何类都可能成为类厂类。有关CCmdTarget类内的类厂结构的声明如下:class CCmdTarget : public Cobject/ OLE interface map implementationpublic:/ data used when CCmdTarget is made OLE awarelong m_dwRef;LPUNKNOWN 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 disconnectLPUNKNOWN 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 ExternalQueryInterface(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 GetInt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论