首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

COM 原理與應用:統一資料傳輸 (UDT) 與剪貼簿/拖放

     編輯:關於C++

統一資料傳輸 (UDT) 概述

COM 定義應用程式間資料交換標準方案 —— 統一資料傳輸。核心在於資料物件,實作 IDataObject 介面,封裝要傳輸的資訊。剪貼簿與拖放是 UDT 兩大典型應用協定。

從 DDE 到 UDT

  • OLE 1.0:DDE (Dynamic Data Exchange),格式簡單、僅用全域記憶體、效率功能受限。
  • OLE 2.0:引入 COM,以 資料物件 + IDataObject 為實體,支援任意儲存媒介、結構化/非結構化/動態資訊。

資料格式與儲存媒介分離

  • FORMATETC:描述資料格式(擴充剪貼簿格式,含目標裝置、切面、媒介類型)。
  • STGMEDIUM:描述儲存媒介(全域記憶體、檔案、IStorage、IStream、GDI 物件等)。
  • 分離使 UDT 適應更廣泛的資料類型與儲存方式。

資料物件與 IDataObject

  • 資料物件 = 實作 IDataObject 的 COM 物件。
  • IDataObject 方法:GetData/GetDataHere/QueryGetData/GetCanonicalFormatEtc/SetData/EnumFormatEtc/DAdvise/DUnadvise/EnumDAdvise。
  • 剪貼簿/拖放傳遞的實際是 IDataObject* 介面指標。

通知連接機制

  • 資料物件狀態變化時主動通知客戶端。
  • 客戶端實作 IAdviseSink(較可連接物件簡化)。
  • IDataObject::DAdvise 建立連接,需提供:接收器 IAdviseSink*、格式資訊 (FORMATETC)、通知旗標 (ADVF_*)。
  • COM 提供 資料通知保持器 (CreateDataAdviseHolder → IDataAdviseHolder),資料物件將通知相關方法委派給它。

剪貼簿整合

  • 傳統 Win32 API:OpenClipboard/SetClipboardData/GetClipboardData... 僅支援預定義格式、全域記憶體。
  • OLE 剪貼簿:OleSetClipboard/OleGetClipboard/OleFlushClipboard/OleIsCurrentClipboard,傳遞 IDataObject*,支援任意資料物件(OLE 文件、ActiveX 控制項、自訂資料),非同步操作。

拖放協定

  • 僅傳輸資料物件 (IDataObject*),同步操作。
  • 涉及來源視窗與目標視窗。
  • RegisterDragDrop 註冊「放置目標」視窗。
  • 來源端實作 IDropSource,目標端實作 IDropTarget。

MFC 封裝

COleDataSource 不支援通知連接;完整通知需自行實作 IDataObject。

資料物件實作注意

  • 進程內/進程外元件均可,標準介面 COM 已提供跨進程封送器,僅影響效能。
  • 自訂格式需雙方協定 FORMATETC 內容。

總結

UDT 以 IDataObject + FORMATETC/STGMEDIUM 為核心,統一剪貼簿(非同步)與拖放(同步)兩大傳輸協定,支援任意資料類型與儲存媒介,並提供資料變更通知機制。MFC COleDataSource/COleDataObject 簡化常見場景開發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類別用途繼承
COleDataSource資料來源端(提供資料),實作 IDataObject,管理內部格式緩衝區,有參考計數CCmdTarget
COleDataObject客戶端(接收資料),包裝 IDataObject*CCmdTarget