1、概述
COM提供了應用之間數據交換的標准方案,稱為統一數據傳輸(UDT,uniform data transfer)。統一數據傳輸技術建立在結構化存儲技術的基礎之上,它通過一個“數據對象”來表達要傳輸的數據信息,因此,統一數據傳輸技術的核心在於數據對象的定義和實現。剪貼板和拖-放是統一數據傳輸的兩個典型應用。
2、數據交換標准
早期的OLE1.0版本使用DDE(Dynamic Data Exchange,動態數據交換)作為數據交換標准,但DDE使用的格式比較簡單,並且只能用全局內存作為傳輸介質,所以傳輸的效率和功能都受限制。OLE2.0版本引入了COM作為其基本的結構模型,使用COM提供的統一數據傳輸作為其數據交換機制,可直接在不同介質之間進行傳輸。
3、數據交換與傳輸協議的分離
在不同應用之間進行數據傳輸操作包括兩方面的內容,首先是數據格式的統一,其次是傳輸協議的建立。
以前采用DDE方式只能使用簡單的數據結構對信息進行描述,COM的統一數據傳輸機制使用“數據對象”作為信息實體,數據對象通過IDataObject 接口暴露其內部信息。由於數據對象本身是一個COM對象,因此它不僅可以表達一般的結構化信息,也可以表達一些非結構化信息,甚至是動態信息。IDataObject接口為應用程序進行數據傳輸建立了標准。在Windows平台上,最基本的傳輸協議為剪貼板、拖-放,應用程序通常利用這兩種協議獲得數據對象。
在統一數據機制引入到Windows系統之前,Windows提供了許多API函數以及預定義的消息用於應用之間傳輸數據的橋梁。這些API函數把傳輸協議和傳輸數據信息綁在一起,比如用於處理剪貼板數據傳送的一組函數:GetClipboardData、SetClipboardData和 CloseClipboard等,而DDE則通過發送消息作為數據傳送的手段。
COM提供的統一數據傳輸機制可很好地避免Windows API函數的數據傳輸的限制,一方面它定義了兩個數據結構FORMATETC和STGMEDIUM,分別用來描述數據格式和存儲介質,使新的機制可適應更廣泛的數據類型和存儲介質;另一方面它為數據對象提供了“數據表化通知”的機制。
數據對象的概念使統一數據傳輸機制不僅可用於應用之間傳輸數據,也可以成為組件程序之間的信息交換標准。
4、剪貼板
剪貼板是一個全系統共享的數據緩沖區,每個應用都可以通過系統提供的API函數訪問剪貼板。它的三個標准操作是:剪切、復制、粘貼。
Windows系統在引入COM的統一數據傳輸機制之前,提供了一組API函數以及預定義的CF_***標准格式,這些格式包括文本類型、位圖類型、圖元文件(metafile)數據等,而且這些數據必須存放在全局內存中。但剪貼板技術與數據對象結合之後,情況有了很大的變化,可用於傳輸數據對象,比如 OLE文檔對象、ActiveX控制對象等,或者是應用程序中自定義的數據對象,只要此對象實現IDataObject接口即可。剪貼板成為數據對象的提供方和接收方之間的通信協議,而且這種通信方式是異步進行的。
5、拖-放
拖-放技術也是基本的傳輸協議,它的使用方式與剪貼板有所不同,程序采用同步的方式進行。
6、數據結構FORMATETC和STGMEDIUM
FORMATETC結構定義了用於傳輸的數據格式,它擴充了基本的剪貼板數據格式;STGMEDIUM結構定義了用於傳輸的介質類型,它即可以描述常用的全局內存,也可以描述其他的存儲介質。
7、數據對象和IDataObject接口
統一數據傳輸中的數據對象是一個COM對象,它實現了IDataObject接口。在數據對象的實現方(即提供方)和客戶(即接收方)之間,IDataObject接口為兩者建立了標准,而各種傳輸協議如剪貼板和拖-放等,它們所傳遞的實際上是IDataObject接口指針。
8、通報連接機制
為了實現從數據對象到客戶程序的通信過程,要求數據對象在狀態發生變化時能主動通知客戶程序,而客戶程序必須提供一個接收器對象以便接收這些通知,這是曾在第六章中介紹過的COM提供的通過接收器對象建立的通用的雙向通信機制。而在統一數據傳輸機制中使用的通知接收器要簡單一些,它是由客戶程序實現的內部對象,只需實現IAdviseSink接口。
數據對象與客戶程序之間的連接方式較第六章中的可連接對象機制簡便得多。
客戶程序通過IDataObject::DAdvise函數建立通報連接時,它除了要提供接收器對象的IAdciseSink接口指針,還要提供兩個信息:格式信息和與通報連接有關的標志信息。
COM提供了“數據通報控制器”(data advise holder)的內部對象,數據通報控制器對象實現了IDataAdviseHolder接口。數據對象利用COM API函數CreateDataAdviseHolder創建一個數據通報控制器對象,該函數返回對象的IDataAdviseHolder接口指針,然後,數據對象把IDataObject接口的三個與變化通知有關的成員函數直接委托給數據通報控制器對象IDataAdviseHolder接口的相應成員函數。
9、數據對象
在實現數據對象時,不管是進程內組件程序,還是進程外組件程序,由於與數據對象有關的接口都是COM定義的標准接口,COM已經提供了這些接口的跨進程列集器,所以不用考慮跨進程的細節。進程模型只影響性能因素。
10、通過剪貼板傳輸數據
在剪貼板與數據對象結合起來之前,Win32中為支持剪貼板操作而提供了一組API函數:OpenClipboard、CloseClipboard、 EmptyClipboard、SetClipboardData、GetClipboardData、 IsClipboardFormatAvailable、EnumClipboardFormats。
因為剪貼板是Windows操作系統支持的特性,而COM是與平台無關的組件對象模型規范,所以剪貼板和數據對象結合之後的特性不屬於COM范疇,嚴格來講應該數OLE技術的一部分,稱之為OLE剪貼板。OLE也提供了四個封裝過的API函數:OleSetClipboard、 OleGetClipnoard、OleFlushClipboard、OleCurrentClipboard。
11、拖-放數據傳輸協議
與剪貼板傳輸協議不同,OLE的拖-放數據傳輸協議只能傳輸數據對象,而不能傳輸其他的數據。
拖-放操作是一個與界面有關的數據傳輸過程,通常涉及到源窗口和目標窗口。
OLE提供的API函數RegisterDragDrop把“放目標”對象與窗口聯系起來。
12、MFC對剪貼板和拖-放的支持
MFC提供了兩個類用於支持數據對象,分別為COleDataSource和COleDataObject類。這兩個類直接繼承於CCmdTarget,其中COleDataSource類用於源程序一方,COleDataObject用於客戶程序一方。
COleDataSource類實現了IDataObject接口,但是不支持通報連接。COleDataSource類創建並管理了一組數據格式,這些數據格式被保存在對象內部(緩沖區中)。COleDataSource類實現了一個真正的COM對象,它有自己的引用計數。