




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、十五 统一数据传输数据格式数据对象和IDataObject接口通报连接机制数据变化通报机制. 数据变化通知的实现方式通过剪贴板传输数据MFC对数据对象的支持11 数据格式COM提供了UDT(Uniform Data Transfer)作为应用系统之间的数据交换方案。COM之前的数据传输:剪贴板, DDE 局限性: 1。数据格式限制。只能使用预定义的几种格式 2。被传输的数据只能位于全局内存中。 3。没有双向通讯机制。 4。数据格式与传输协议相关。COM使用数据对象作为数据实体,数据对象通过IDataObject接口暴露其内部信息。数据的传递变成了数据对象的创建和接口指针的传递。(永久对象,数据
2、对象,都是COM对象,都有状态.) UDT 定义了两个数据结构FORMATETC 和STGMEDIUM分别描述数据格式和存储介质以适应广泛的数据类型和存储介质。且提供了双向通讯机制。 数据对象可以称为应用之间交换信息的标准。数据对象的IDataObject接口指针。统一的方式访问、操作。数据对象的操作过程频繁地使用了如下的两个数据结构:2typedef struct tagFORMATETC CLIPFORMAT cfFormat; DVTARGETDEVICE *ptd; DWORD dwAspect; LONG lindex; DWORD tymed; FORMATETC1。CLIPFOR
3、MAT cfFormat; 数据格式。预定义的数据格式. UINT RegisterClipboardFormat( LPCTSTR lpszFormat / name of new format ); 可以创建新的数据格式。2。ptd指向DVTARGETDEVICE数据结构typedef struct tagDVTARGETDEVICE DWORD tdSize; /结构长度 WORD tdDriverNameOffset; / 设备驱动名 WORD tdDeviceNameOffset;/ 设备名 WORD tdPortNameOffset; / 端口名 WORD tdExtDevmode
4、Offset; / DEVMODE结构 BYTE tdData 1 ; DVTARGETDEVICE;33。dwAspect 是一个枚举,指定图形数据的显示方式enum tagDVASPECT DVASPECT_CONTENT= 1,DVASPECT_THUMBNAIL= 2,DVASPECT_ICON= 4,DVASPECT_DOCPRINT= 8 DVASPECT;4。lindex为dwAspect的补充。5。tymed指定存储介质。可以指定全局内存、磁盘文件、或者存储对象等。另一个常用的结构如下: typedef struct tagSTGMEDIUM DWORD tymed; unio
5、n HBITMAP hBitmap; HMETA hMeta; HENHMETA; HGLOBAL hGlobal; LPOLESTR lpsz; IStream *pstm; IStorage *pstg; u; IUnknown *pUnkForRelease;STGMEDIUM;41。其中tymed指明介质的类型。typedef enum tagTYMED TYMED_HGLOBAL= 1,TYMED_FILE= 2,TYMED_ISTREAM= 4,TYMED_ISTORAGE= 8,TYMED_GDI= 16,TYMED_MFPICT= 32,TYMED_ENHMF= 64,TYME
6、D_NULL= 0 TYMED;2。联合成员u指明数据的真正位置,根据tymed的值使用相应的联合成员。3。pUnkownForRelease用来控制数据的释放过程。应用程序可以选择合适的存储介质来传输数据。这两个数据结构用于数据对象的各种操作之中.52 数据对象和IDataObject接口数据对象是一个COM对象,它实现了IDataObject接口。一旦应用程序创建了一个数据对象,此对象可以通过任一种传输协议传递到另一个应用。通过协议传送的实际上是IDataObject接口指针。(此传输协议使用了接口的列集,散集过程) .发送、接受双方都使用IDataObject接口来操作数据。接口的定义如
7、下:class IDataObject : public IUnknown public: virtual HRESULT GetData( FORMATETC *pformatetcIn, inSTGMEDIUM *pmedium out ) = 0; /*接受程序通过传输协议得到数据对象的接口指针后,在 pFormatetc中指定提取数据所使用的格式,并把数据放在pmedium 指针中。如果数据对象有我们所指定的格式,GetData会填充pmedium,否则出错返回。*/ virtual HRESULT GetDataHere( FORMATETC *pformatetc, inSTGME
8、DIUM *pmedium in, out ) = 0; /*同GetData,但是,接受方也要负责预先分配存储空间pmedium*/ 6virtual HRESULT QueryGetData( FORMATETC *pformatetc in) = 0; /*询问数据对象是否支持pFormatetc数据格式,如果支持的话,再调用GetData会更好。*/ virtual HRESULT GetCanonicalFormatEtc( FORMATETC *pformatectIn, in FORMATETC *pformatetcOut out) = 0; /*提供一个标准的等价的FORMA
9、TETC结构。据此判断不同的FORMATETC结构能否得到同样的数据,以免重复调用GetData。*/ virtual HRESULT SetData( FORMATETC *pformatetc, in STGMEDIUM *pmedium, in BOOL fRelease in) = 0; /*接收方客户程序为数据对象提供数据。 */ virtual HRESULT EnumFormatEtc( DWORD dwDirection,IEnumFORMATETC * *ppenumFormatEtc) = 0; /*返回一个数据格式枚举器,可以枚举该数据对象所支持的数据格式。*/ 7vir
10、tual HRESULT DAdvise( FORMATETC *pformatetc,DWORD advf,IAdviseSink *pAdvSink, in DWORD *pdwConnection out) = 0; /*在客户的通报接收器(advisory sink)和数据对象之间建立一个通报连接(advisory connection),当数据对象中的数据发生变化时,它可以通知客户程序的通报连接器。 pdwConnection保留连接标志,以便客户解除连接使用。*/virtual HRESULT DUnadvise( DWORD dwConnection in ) = 0;/*利用D
11、Advise函数返回的连接标志解除连接。*/ virtual HRESULT EnumDAdvise( IEnumSTATDATA *ppenumAdvise) = 0;/*返回一个STATDATA结构的枚举器。 STATDATA结构正好与DAdvise函数的参数一一对应*/;83.1 数据变化通报机制.客户得到IDataObject指针,可以读取数据,然而客户希望在数据改变的时候能及时得到通知,而不是一遍遍地轮询。要求数据对象在数据变化时能主动通知客户,客户应提供一个接收器以接受这些通知。COM提供了连接点机制以实现双向通讯。在UDT中,客户程序只需实现IAdviseSink接口:class
12、 IAdviseSink :public IUnkown pulbic: virtual void OnDataChange(FORMATETC*pformatetc,STGMEDIUM *pmedium)=0;.而数据对象作为源对象并没有实现IConnectionPointContainer接口,而是直接使用IDataObject的后三个成员函数 代替IConnectionPoint接口的Advise,UAdvise,和EnumConnections。之所以可以这样简化,是因为在数据对象和客户的交互过程中,出接口以及其成员函数可以事先定下来,而且功能也很清楚。比较 IConnectionPo
13、int的Advise的连接函数:3 通报连接机制9 virtual HRESULT Advise( IUnknown *pUnkSink, DWORD *pdwCookie) = 0; 用来处理通用的连接。IDataObject的DAdvise函数除了直接指定IAdviseSink接口以外(而不是含糊的IUnkown接口),同时指定了客户方感兴趣的数据格式pformtec,以及通报的方式advf。(见p284)。使用方式: 数据对象方:可以使用诸如MFC的实现,见后. 接收方:客户程序实现IAdviseSink接口,当然指定OnDataChanged等函数, 然后在得到数据对象指针后,通过ID
14、ataObject调用DAdvise函数,将刚才的IAdviseSink接口传入,以响应数据变化通知.客户数据对象通报连接接收器客户把接收器的接口指针传给对象数据改变时,数据对象调用OnDataChange成员IDataObjectIAdviseSink103.2 数据变化通知的实现方式:数据对象对连接的实现方式可以按照连接点机制中类似的方法来进行. COM提供了“数据通报控制器” (data advise holder)这个内部对象(没有类厂,没有CLSID)以简化这个工作.(此对象在数据对象内部。) WINOLEAPI CreateDataAdviseHolder(IDataAdviseH
15、older *ppDAHolder ); 其中IDataAdviseHolder接口的定义class IDataAdviseHolder : public IUnknown public: virtual HRESULT Advise( IDataObject *pDataObject,FORMATETC *pFetc, DWORD advf,IAdviseSink *pAdvise, DWORD *pdwConnection) = 0; virtual HRESULT Unadvise(DWORD dwConnection) = 0; virtual HRESULT EnumAdvise(
16、EnumSTATDATA * *ppenumAdvise) = 0; virtual HRESULT SendOnDataChange( IDataObject *pDataObject, DWORD dwReserved,DWORD advf) = 0; ;11数据对象利用CreateDataAdviseHolder创建一个数据通报控制器对象,并返回一个IDataAdviseHolder 接口。HRESULT MyDataObject:DAdvise(FORMATETC *pformatetc,DWORD advf,IAdviseSink *pAdvSink,DWORD *pdwConnec
17、tion) return pDAHolder-Advise(IDataObject*)this, FORMATETC *pformatetc,DWORD advf,IAdviseSink *pAdvSink,DWORD *pdwConnection );其他两个函数的参数都一一对应。当数据对象要调用它所连接的接收器sink的OnDataChange函数时,就把自己的IDataObject接口指针和通知方式标志advf一起传给IDataAdviseHolder:SendOnDataChange函数。在数据通报控制器内部,记录了所有通过Advise函数建立的sink的接口指针。数据通报控制器接收到
18、调用后,检查连接标志,找到相应的advise sink,然后调用IAdviseSink:OnDataChange函数。124 通过剪贴板传输数据我们需要能传输数据对象接口指针的传输机制。剪贴板机制是Windows上一种IPC机制。它是全局共享的资源。WIN32有一组API进行剪贴板操作。 p287列出了常用的几个。OLE对剪贴板进行了扩充,称为“OLE剪贴板”,使之可以作为数据对象的传输通道。WINOLEAPI OleSetClipboard(IDataObject * pDataObj ); 数据提供方向ole剪贴板上放数据对象WINOLEAPI OleGetClipboard(IDataO
19、bject * ppDataObj ); 数据接收方从ole剪贴板上得到数据对象接口指针WINOLEAPI OleFlushClipboard( ); 清理剪贴板WINOLEAPI OleIsCurrentClipboard(IDataObject * pDataObject ); 判断某数据对象是否在剪贴板上。其他的数据传输机制也可以传输数据对象.135 MFC对数据对象的支持MFC提供了两个类COleDataSource (使用于数据提供方)和COleDataObject(使用于数据接收方) 实现了IDataObject接口。COleDataSource 常用的成员函数 P290 CacheData 在数据对象的缓冲区中插入数据 SetCLipboard 调用OleSetCLipboard函数把数据对象放到剪贴板上。 DoDragDrop 对拖放的支持。COleDataObject常用的成员函数。P291 AttachClipboard 把当前剪贴板上的数据对象与COleDataObject的数据成员
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水果代理销售合同协议书
- 供应链方案设计
- 2025年新能源汽车轻量化的高强度铝合金与碳纤维复合材料混合结构设计、制造工艺及应用与性能优化可行性研究报告
- 中山医用智能设备项目商业计划书模板
- 大学生快递创业计划书
- 宠物感染性疾病症状及治疗
- 房产解除合同协议书样本
- 当前我国鸡病流行的新特点及防制策略
- 2025年纳米碳酸钙项目立项可行性报告
- 2025年法人离任述职报告范本(三)
- 水利工程施工监理规范SL288-2014(CB、JL用表全套)
- 建筑中级职称《建筑工程管理》历年考试真题题库(含答案)
- DL∕T 707-2014 HS系列环锤式破碎机
- (正式版)JB∕T 14455-2024 土方机械 非公路自卸车 电传动系统控制要求
- 费用组成-特殊施工增加费课件讲解
- 2024年湖南省长沙市雅礼实验中学中考二模考试英语试题
- 2023年八年级历史下册竞赛试卷
- 国民经济行业分类代码表
- 2024年云南省中考历史试卷(附答案)
- 2024-2029年中国无机涂料行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 人工智能设计伦理智慧树知到期末考试答案章节答案2024年浙江大学
评论
0/150
提交评论