《统一数据传输.pptx》由会员分享,可在线阅读,更多相关《统一数据传输.pptx(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、会计学1统一数据传输统一数据传输2n ntypedef struct tagFORMATETC typedef struct tagFORMATETC CLIPFORMAT cfFormat;CLIPFORMAT cfFormat;DVTARGETDEVICE*ptd;DVTARGETDEVICE*ptd;DWORD dwAspect;DWORD dwAspect;LONG lindex;LONG lindex;DWORD tymed;DWORD tymed;FORMATETCFORMATETC1 1。CLIPFORMAT cfFormat;CLIPFORMAT cfFormat;数据格式。预
2、定义的数据格式数据格式。预定义的数据格式.UINT RegisterClipboardFormat(LPCTSTR lpszFormat UINT RegisterClipboardFormat(LPCTSTR lpszFormat/name of new/name of new formatformat););可以创建新的数据格式。可以创建新的数据格式。2 2。ptdptd指向指向DVTARGETDEVICEDVTARGETDEVICE数据结构数据结构typedef struct tagDVTARGETDEVICEtypedef struct tagDVTARGETDEVICE DWORD
3、tdSize;DWORD tdSize;/结构长度结构长度 WORD tdDriverNameOffset;WORD tdDriverNameOffset;/设备驱动名设备驱动名 WORD tdDeviceNameOffset;WORD tdDeviceNameOffset;/设备名设备名 WORD tdPortNameOffset;WORD tdPortNameOffset;/端口名端口名 WORD tdExtDevmodeOffset;WORD tdExtDevmodeOffset;/DEVMODE/DEVMODE结构结构 BYTE tdData 1;BYTE tdData 1;DVTAR
4、GETDEVICE;DVTARGETDEVICE;第2页/共15页第1页/共15页33 3。dwAspectdwAspect 是一个枚举,指定图形数据的显示方式是一个枚举,指定图形数据的显示方式n nenum tagDVASPECTenum tagDVASPECT DVASPECT_CONTENTDVASPECT_CONTENT=1,=1,DVASPECT_THUMBNAILDVASPECT_THUMBNAIL=2,=2,DVASPECT_ICONDVASPECT_ICON=4,=4,DVASPECT_DOCPRINTDVASPECT_DOCPRINT=8=8 DVASPECT;DVASPEC
5、T;4 4。lindexlindex为为dwAspectdwAspect的补充。的补充。5 5。tymedtymed指定存储介质。可以指定全局内存、磁盘文件、或者存储对象等。指定存储介质。可以指定全局内存、磁盘文件、或者存储对象等。n n另一个常用的结构如下另一个常用的结构如下另一个常用的结构如下另一个常用的结构如下:typedef struct tagSTGMEDIUM typedef struct tagSTGMEDIUM DWORD tymed;DWORD tymed;union HBITMAP hBitmap;union HBITMAP hBitmap;HMETAFILEPICT hM
6、etaFilePict;HMETAFILEPICT hMetaFilePict;HENHMETAFILE hEnhMetaFile;HENHMETAFILE hEnhMetaFile;HGLOBAL hGlobal;HGLOBAL hGlobal;LPOLESTR lpszFileName;LPOLESTR lpszFileName;IStream*pstm;IStream*pstm;IStorage*pstg;u;IStorage*pstg;u;IUnknown*pUnkForRelease;IUnknown*pUnkForRelease;STGMEDIUMSTGMEDIUMSTGMEDIU
7、MSTGMEDIUM;第3页/共15页第2页/共15页4n n1 1。其中。其中tymedtymed指明介质的类型。指明介质的类型。n ntypedef enum tagTYMEDtypedef enum tagTYMED TYMED_HGLOBALTYMED_HGLOBAL=1,=1,TYMED_FILETYMED_FILE=2,=2,TYMED_ISTREAMTYMED_ISTREAM=4,=4,TYMED_ISTORAGETYMED_ISTORAGE=8,=8,TYMED_GDITYMED_GDI=16,=16,TYMED_MFPICTTYMED_MFPICT=32,=32,TYMED_
8、ENHMFTYMED_ENHMF=64,=64,TYMED_NULLTYMED_NULL=0=0 TYMED;TYMED;2 2。联合成员。联合成员u u指明数据的真正位置,根据指明数据的真正位置,根据tymedtymed的值使用相应的联合成员。的值使用相应的联合成员。3 3。pUnkownForReleasepUnkownForRelease用来控制数据的释放过程。用来控制数据的释放过程。应用程序可以选择合适的存储介质来传输数据。应用程序可以选择合适的存储介质来传输数据。这两个数据结构用于数据对象的各种操作之中这两个数据结构用于数据对象的各种操作之中.第4页/共15页第3页/共15页52 2
9、 数据对象和数据对象和数据对象和数据对象和IDataObjectIDataObject接口接口接口接口n n数据对象是一个数据对象是一个COMCOM对象,它实现了对象,它实现了IDataObjectIDataObject接口。一旦应用接口。一旦应用程序创建了一个数据对象,此对象可以通过任一种传输协议传递程序创建了一个数据对象,此对象可以通过任一种传输协议传递到另一个应用。通过协议传送的实际上是到另一个应用。通过协议传送的实际上是IDataObjectIDataObject接口指针。接口指针。(此传输协议使用了接口的列集此传输协议使用了接口的列集,散集过程散集过程).发送、接受双方都使发送、接受
10、双方都使用用IDataObjectIDataObject接口来操作数据。接口来操作数据。n n接口的定义如下接口的定义如下:n nclass IDataObject:public IUnknown public:class IDataObject:public IUnknown public:virtual HRESULT virtual HRESULT GetDataGetData(FORMATETC*pformatetcIn,(FORMATETC*pformatetcIn,ininSTGMEDIUM*pmedium STGMEDIUM*pmedium outout )=0;)=0;/*/*
11、接受程序通过传输协议得到数据对象的接口指针后,在接受程序通过传输协议得到数据对象的接口指针后,在 pFormatetcpFormatetc中指定提取数据所使用的格式,并把数据放在中指定提取数据所使用的格式,并把数据放在pmedium pmedium 指针中。如果数据对象有我们所指定的格式,指针中。如果数据对象有我们所指定的格式,GetDataGetData会填充会填充pmediumpmedium,否则出错返回。否则出错返回。*/*/virtual HRESULT virtual HRESULT GetDataHere GetDataHere(FORMATETC*pformatetc,(FORM
12、ATETC*pformatetc,ininSTGMEDIUM*pmedium STGMEDIUM*pmedium in,outin,out )=0;)=0;/*/*同同GetDataGetData,但是,接受方也要负责预先分配存储空间但是,接受方也要负责预先分配存储空间pmedium*/pmedium*/第5页/共15页第4页/共15页6virtual HRESULT virtual HRESULT QueryGetDataQueryGetData(FORMATETC*pformatetc(FORMATETC*pformatetc inin)=0;)=0;/*/*询问数据对象是否支持询问数据对
13、象是否支持pFormatetcpFormatetc数据格式,如果支持的话,再调用数据格式,如果支持的话,再调用GetDataGetData会更好。会更好。*/*/virtual HRESULT virtual HRESULT GetCanonicalFormatEtcGetCanonicalFormatEtc(FORMATETC(FORMATETC*pformatectIn,*pformatectIn,inin FORMATETC*pformatetcOut FORMATETC*pformatetcOut outout)=0;)=0;/*/*提供一个标准的等价的提供一个标准的等价的FORMAT
14、ETCFORMATETC结构。据此判断不同的结构。据此判断不同的FORMATETCFORMATETC结构能否得到同样的数据,以免重复调用结构能否得到同样的数据,以免重复调用GetDataGetData。*/*/virtual HRESULT virtual HRESULT SetDataSetData(FORMATETC*pformatetc,(FORMATETC*pformatetc,inin STGMEDIUM*pmedium,STGMEDIUM*pmedium,inin BOOL fRelease BOOL fRelease inin)=0;)=0;/*/*接收方客户程序为数据对象提供数
15、据。接收方客户程序为数据对象提供数据。*/*/virtual HRESULT virtual HRESULT EnumFormatEtcEnumFormatEtc(DWORD dwDirection,(DWORD dwDirection,IEnumFORMATETC*ppenumFormatEtc)=0;IEnumFORMATETC*ppenumFormatEtc)=0;/*/*返回一个数据格式枚举器,可以枚举该数据对象所支持的数据格式。返回一个数据格式枚举器,可以枚举该数据对象所支持的数据格式。*/*/第6页/共15页第5页/共15页7virtual HRESULT virtual HRES
16、ULT DAdviseDAdvise(FORMATETC*pformatetc,DWORD(FORMATETC*pformatetc,DWORD advf,IAdviseSink*pAdvSink,advf,IAdviseSink*pAdvSink,inin DWORD*pdwConnection DWORD*pdwConnection outout)=)=0;0;/*/*在客户的通报接收器(在客户的通报接收器(advisory sink)advisory sink)和数据对象之间建立一个通报和数据对象之间建立一个通报连接(连接(advisory connection)advisory con
17、nection),当数据对象中的数据发生变化时,当数据对象中的数据发生变化时,它可以通知客户程序的通报连接器。它可以通知客户程序的通报连接器。pdwConnectionpdwConnection保留连接保留连接标志,以便客户解除连接使用。标志,以便客户解除连接使用。*/*/virtual HRESULT virtual HRESULT DUnadviseDUnadvise(DWORD dwConnection(DWORD dwConnection inin)=0;)=0;/*/*利用利用DAdviseDAdvise函数返回的连接标志解除连接。函数返回的连接标志解除连接。*/*/virtual
18、HRESULT virtual HRESULT EnumDAdviseEnumDAdvise(IEnumSTATDATA*ppenumAdvise)(IEnumSTATDATA*ppenumAdvise)=0;=0;/*/*返回一个返回一个STATDATASTATDATA结构的枚举器。结构的枚举器。STATDATASTATDATA结构正好与结构正好与DAdviseDAdvise函数的参数一一对应函数的参数一一对应*/*/;第7页/共15页第6页/共15页83.1 3.1 数据变化通报机制数据变化通报机制数据变化通报机制数据变化通报机制.客户得到客户得到IDataObjectIDataObjec
19、t指针,可以读取数据,然而客户希望在数据改变的时指针,可以读取数据,然而客户希望在数据改变的时候能及时得到通知,而不是一遍遍地轮询。要求数据对象在数据变化候能及时得到通知,而不是一遍遍地轮询。要求数据对象在数据变化时能主动通知客户,客户应提供一个接收器以接受这些通知。时能主动通知客户,客户应提供一个接收器以接受这些通知。COMCOM提供了连接点机制以实现双向通讯。提供了连接点机制以实现双向通讯。在在UDTUDT中,客户程序只需实现中,客户程序只需实现IAdviseSinkIAdviseSink接口:接口:class IAdviseSink class IAdviseSink:public IU
20、nkownpublic IUnkown pulbic:pulbic:virtual void OnDataChange(FORMATETC*pformatetc,STGMEDIUM virtual void OnDataChange(FORMATETC*pformatetc,STGMEDIUM*pmedium)=0;*pmedium)=0;.n n而数据对象作为源对象并没有实现而数据对象作为源对象并没有实现IConnectionPointContainerIConnectionPointContainer接口,接口,而是直接使用而是直接使用IDataObjectIDataObject的后三个成
21、员函数的后三个成员函数 代替代替IConnectionPointIConnectionPoint接接口的口的AdviseAdvise,UAdviseUAdvise,和和EnumConnectionsEnumConnections。n n之所以可以这样简化,是因为在数据对象和客户的交互过程中,出接之所以可以这样简化,是因为在数据对象和客户的交互过程中,出接口以及其成员函数可以事先定下来,而且功能也很清楚。比较口以及其成员函数可以事先定下来,而且功能也很清楚。比较 IConnectionPointIConnectionPoint的的AdviseAdvise的连接函数:的连接函数:3 3 通报连接机
22、制通报连接机制通报连接机制通报连接机制第8页/共15页第7页/共15页9n n virtual HRESULT Advise(virtual HRESULT Advise(IUnknownIUnknown *pUnkSink,DWORD *pdwCookie)*pUnkSink,DWORD *pdwCookie)=0;=0;用来处理通用的连接。用来处理通用的连接。n nIDataObjectIDataObject的的DAdviseDAdvise函数除了直接指定函数除了直接指定IAdviseSinkIAdviseSink接口以外(而不是含接口以外(而不是含糊的糊的IUnkownIUnkown接口
23、),同时指定了客户方感兴趣的数据格式接口),同时指定了客户方感兴趣的数据格式pformtecpformtec,以及通报的方式以及通报的方式advfadvf。(。(见见p284p284)。)。n n使用方式使用方式:数据对象方数据对象方:可以使用诸如可以使用诸如MFCMFC的实现的实现,见后见后.接收方接收方:客户程序实现客户程序实现IAdviseSinkIAdviseSink接口接口,当然指定当然指定OnDataChangedOnDataChanged等函数等函数,然后在得到数据对象指针后然后在得到数据对象指针后,通过通过IDataObjectIDataObject调用调用DAdviseDAd
24、vise函数函数,将刚才将刚才的的IAdviseSinkIAdviseSink接口传入接口传入,以响应数据变化通知以响应数据变化通知.客户数据对象通报连接接收器客户把接收器的接口指针传给对象数据改变时,数据对象调用OnDataChange成员IDataObjectIAdviseSink第9页/共15页第8页/共15页10n n3.2 3.2 数据变化通知的实现方式数据变化通知的实现方式数据变化通知的实现方式数据变化通知的实现方式:n n数据对象对连接的实现方式可以按照连接点机制中类似的方法来进行数据对象对连接的实现方式可以按照连接点机制中类似的方法来进行.COMCOM提供了提供了“数据通报控制
25、器数据通报控制器”(data advise holderdata advise holder)这个内部对象(没有类这个内部对象(没有类厂,没有厂,没有CLSIDCLSID)以简化这个工作以简化这个工作.(此对象在数据对象内部。)(此对象在数据对象内部。)WINOLEAPI CreateDataAdviseHolder(WINOLEAPI CreateDataAdviseHolder(IDataAdviseHolder*ppDAHolder );IDataAdviseHolder*ppDAHolder );其中其中IDataAdviseHolderIDataAdviseHolder接口的定义接口
26、的定义class IDataAdviseHolder:public IUnknownclass IDataAdviseHolder:public IUnknown public:public:virtual HRESULT Advise(IDataObject *pDataObject,FORMATETC *pFetc,virtual HRESULT Advise(IDataObject *pDataObject,FORMATETC *pFetc,DWORD advf,IAdviseSink *pAdvise,DWORD*pdwConnection)=0;DWORD advf,IAdviseS
27、ink *pAdvise,DWORD*pdwConnection)=0;virtual HRESULT Unadvise(DWORD dwConnection)=0;virtual HRESULT Unadvise(DWORD dwConnection)=0;virtual HRESULT EnumAdvise(EnumSTATDATA *ppenumAdvise)=0;virtual HRESULT EnumAdvise(EnumSTATDATA *ppenumAdvise)=0;virtual HRESULT SendOnDataChange(virtual HRESULT SendOnD
28、ataChange(IDataObject *pDataObject,DWORD dwReserved,DWORD advf)=0;IDataObject *pDataObject,DWORD dwReserved,DWORD advf)=0;第10页/共15页第9页/共15页11数据对象利用数据对象利用CreateDataAdviseHolderCreateDataAdviseHolder创建一个数据通报控制器对象,创建一个数据通报控制器对象,并返回一个并返回一个IDataAdviseHolder IDataAdviseHolder 接口。接口。HRESULT MyDataObject:DA
29、dvise(FORMATETC HRESULT MyDataObject:DAdvise(FORMATETC*pformatetc,DWORD advf,IAdviseSink*pAdvSink,DWORD*pformatetc,DWORD advf,IAdviseSink*pAdvSink,DWORD*pdwConnection)*pdwConnection)return pDAHolder-Advise(IDataObject*)this,FORMATETC return pDAHolder-Advise(IDataObject*)this,FORMATETC*pformatetc,DWO
30、RD advf,IAdviseSink*pAdvSink,DWORD*pformatetc,DWORD advf,IAdviseSink*pAdvSink,DWORD*pdwConnection);*pdwConnection);其他两个函数的参数都一一对应。其他两个函数的参数都一一对应。n n当数据对象要调用它所连接的接收器当数据对象要调用它所连接的接收器sinksink的的OnDataChangeOnDataChange函数时,函数时,就把自己的就把自己的IDataObjectIDataObject接口指针和通知方式标志接口指针和通知方式标志advfadvf一起传给一起传给IDataAdv
31、iseHolderIDataAdviseHolder:SendOnDataChangeSendOnDataChange函数。在数据通报函数。在数据通报控制器内部,记录了所有通过控制器内部,记录了所有通过AdviseAdvise函数建立的函数建立的sinksink的接口指针。的接口指针。数据通报控制器接收到调用后,检查连接标志,找到相应的数据通报控制器接收到调用后,检查连接标志,找到相应的advise sinkadvise sink,然后调用然后调用IAdviseSinkIAdviseSink:OnDataChangeOnDataChange函数。函数。第11页/共15页第10页/共15页124
32、 4 通过剪贴板传输数据通过剪贴板传输数据通过剪贴板传输数据通过剪贴板传输数据n n我们需要能传输数据对象接口指针的传输机制。我们需要能传输数据对象接口指针的传输机制。n n剪贴板机制是剪贴板机制是WindowsWindows上一种上一种IPCIPC机制。它是全局共享的资源。机制。它是全局共享的资源。WIN32WIN32有一组有一组APIAPI进行剪贴板操作。进行剪贴板操作。p287p287列出了常用的几个。列出了常用的几个。n nOLEOLE对剪贴板进行了扩充,称为对剪贴板进行了扩充,称为“OLEOLE剪贴板剪贴板”,使之可以作,使之可以作为为数据对象的传输通道数据对象的传输通道数据对象的传
33、输通道数据对象的传输通道。1.1.WINOLEAPI OleSetClipboard(IDataObject*pDataObj );WINOLEAPI OleSetClipboard(IDataObject*pDataObj );数据提供方向数据提供方向oleole剪贴板上放数据对象剪贴板上放数据对象2.2.WINOLEAPI OleGetClipboard(IDataObject*ppDataObj);WINOLEAPI OleGetClipboard(IDataObject*ppDataObj);数据接收方从数据接收方从oleole剪贴板上得到数据对象接口指针剪贴板上得到数据对象接口指针3
34、.3.WINOLEAPI OleFlushClipboard();WINOLEAPI OleFlushClipboard();清理剪贴板清理剪贴板4.4.WINOLEAPI OleIsCurrentClipboard(IDataObject*WINOLEAPI OleIsCurrentClipboard(IDataObject*pDataObject);pDataObject);判断某数据对象是否在剪贴板上。判断某数据对象是否在剪贴板上。n n其他的数据传输机制也可以传输数据对象其他的数据传输机制也可以传输数据对象.第12页/共15页第11页/共15页135 MFC5 MFC对数据对象的支持对
35、数据对象的支持对数据对象的支持对数据对象的支持n nMFCMFC提供了两个类提供了两个类COleDataSource(COleDataSource(使用于数据提供方使用于数据提供方)和和COleDataObject(COleDataObject(使用于数据接收方使用于数据接收方)实现了实现了IDataObjectIDataObject接口。接口。n nCOleDataSource COleDataSource 常用的成员函数常用的成员函数常用的成员函数常用的成员函数 P290P290 CacheDataCacheData 在数据对象的缓冲区中插入数据在数据对象的缓冲区中插入数据 SetCLip
36、boardSetCLipboard 调用调用OleSetCLipboardOleSetCLipboard函数把数据对象放到剪贴板上。函数把数据对象放到剪贴板上。DoDragDropDoDragDrop 对拖放的支持。对拖放的支持。n nCOleDataObjectCOleDataObject常用的成员函数。常用的成员函数。常用的成员函数。常用的成员函数。P291P291 AttachClipboardAttachClipboard 把当前剪贴板上的数据对象与把当前剪贴板上的数据对象与COleDataObjectCOleDataObject的数据成员的数据成员m_lpDataObjectm_lp
37、DataObject联系起来。联系起来。DetachDetach 解除联系解除联系 GetDataGetData 指定指定FORMATETCFORMATETC格式,准备格式,准备STGMEDIUMSTGMEDIUM指针后调用指针后调用IDataObjectIDataObject:GetDataGetData,取回的数据存放在取回的数据存放在STGMEDIUMSTGMEDIUM指针中。指针中。第13页/共15页第12页/共15页14MFCMFC应用处理剪贴板应用处理剪贴板源程序原始数据COleDataSource对象格式1格式2客户程序目标数据COleDataObject对象m_lpDataOb
38、jectIDataObject剪贴板复制SetClipboard粘贴 AttachClipboard调用CacheGlobalData或CacheData调用GetGlobalData或GetData第14页/共15页第13页/共15页15n n例子:例子:发送方:发送方:发送方:发送方:COleDataSource*pSource=new COleDataSource();COleDataSource*pSource=new COleDataSource();/创建数据对象创建数据对象 .HGLOBAL hHeader=:GlobalAlloc(GMEM_SHARE,HGLOBAL hHea
39、der=:GlobalAlloc(GMEM_SHARE,nHeaderSize+nImageSize);nHeaderSize+nImageSize);.pSource-CacheGlobalData(CF_DIB,hHeader);pSource-CacheGlobalData(CF_DIB,hHeader);/缓冲数据缓冲数据 .pSource-SetClipboard();pSource-SetClipboard();/数据对象放到剪贴板上数据对象放到剪贴板上 接收方:接收方:接收方:接收方:.COleDataObject dataObject;COleDataObject dataObject;/创建数据对象创建数据对象 dataObject.AttachClipboard()dataObject.AttachClipboard();/数据对象与剪贴板相连数据对象与剪贴板相连 HGLOBAl hDib=dataObject.GetGlobalData(CF_DIB);HGLOBAl hDib=dataObject.GetGlobalData(CF_DIB);/读取数据读取数据 .第15页/共15页第14页/共15页