資料物件和資料來源: 建立和解構

本文所述資料物件與資料來源 (OLE),資料物件和資料來源代表資料傳輸的兩面。這份文件解釋何時建立和終結這些物件和正常運作,執行您的資料傳輸的來源包括:

  • 建立資料物件

  • 資料物件的終結

  • 建立資料來源

  • 資料來源的終結

建立資料物件

資料物件由接收端應用程式 — 是用戶端或伺服器。接收端應用程式裡的資料物件是連接的來源應用程式和接收端應用程式之間的其中一端。接收端應用程式裡的資料物件用來存取和操作資料來源中的資料。

有兩種常見的情況下需要的資料物件的位置。第一種情況是當資料放在使用拖放功能的應用程式中。第二種情況是,從 [編輯] 功能表選擇 [貼上] 或 [選擇性貼上時。

在拖放的情況下,您不需要建立資料物件。現有的資料物件的指標就會傳遞至您OnDrop函式。這個資料物件由架構做為拖放作業的一部分,而且會終結接下來。這並不一定如此完成貼上是由另一種方法。如需詳細資訊,請參閱終結資料物件。

如果應用程式正在執行貼上] 或 [貼上特殊作業,您應該建立COleDataObject物件及呼叫其AttachClipboard成員函式。這會將 [剪貼簿] 上的資料關聯的資料物件。您接著可以使用這個資料物件在您貼上函式。

如需如何這麼做的範例,請參閱 DoPasteItem MAINVIEW 中的函式。CPP 檔案也就是 MFC OLE 範例一部分 OCLIENT。OCLIENT 實作會執行所有的貼上作業及呼叫的函式 DoPasteItem 從其OnDropOnPaste,以及 OnPasteLink 函式。因為OnDrop含有一個指標至資料物件,傳遞給它,它會傳遞指標上以 DoPasteItemOnPasteOnPasteLink 傳遞 NULL 這個引數,請告知 DoPasteItem 建立資料物件,並將它附加到剪貼簿。這種配置分隔您的貼上程式碼,因此您只需要在一個地方,進行偵錯,但您仍然可以用它用於兩種貼上作業。

資料物件的終結

如果您依照所述的配置建立的資料物件,資料物件的終結是小事一樁的長寬的資料傳輸。Mfc 會損壞您貼上函式中所建立的資料物件,當您貼上函式會傳回。

如果您遵循的處理貼上作業的另一種方法,請確定您貼上作業完成後,會終結資料物件。直到被損毀的資料物件,就會成功地將資料複製到剪貼簿應用程式。

建立資料來源

資料來源會使用資料傳送,可為用戶端或伺服器端的資料傳輸的來源。來源應用程式中的資料來源是連接的某一端之來源應用程式和接收端應用程式之間。接收端應用程式裡的資料物件用來在資料來源中的資料互動。

當應用程式需要將資料複製到 [剪貼簿] 時,會建立資料來源。一般情況下執行,就像這樣:

  1. 使用者選擇一些資料。

  2. 使用者選擇複製 (或剪下) 從 編輯功能表或開始拖放作業。

  3. 根據程式的設計,在應用程式會建立任何一個COleDataSource物件或物件從類別衍生自COleDataSource

  4. 所選取的資料時,會插入至資料來源上,藉由呼叫其中一個函式在COleDataSource::CacheDataCOleDataSource::DelayRenderData群組。

  5. 應用程式呼叫SetClipboard成員函式 (或DoDragDrop成員函式,如果這是個拖放作業) 屬於在步驟 3 中所建立的物件。

  6. 如果這是剪下作業或DoDragDrop會傳回DROPEFFECT_MOVE,從文件中刪除在步驟 1 中所選的資料。

這種情況下由 MFC OLE 範例實作 OCLIENTHIERSVR。查看每個應用程式的來源CView-衍生類別的所有GetClipboardDataOnGetClipboardData函式。這兩個函數會在COleClientItemCOleServerItem-衍生類別實作。下列範例程式會提供如何實作這些概念的極佳範例。

您可能想要建立的其他一種情況COleDataSource物件就會發生,如果您要修改的拖放作業的預設行為。如需詳細資訊,請參閱將拖放: 自訂發行項。

資料來源的終結

資料來源必須摧毀目前負責這些應用程式。在其中您把資料來源 OLE 的情況下,例如呼叫COleDataSource::DoDragDrop,您需要呼叫 pDataSrc-> InternalRelease。例如:

void CMyListView::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
   UNREFERENCED_PARAMETER(pResult);

   LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

   CMyDataSource* pDataSrc = new CMyDataSource();
   if (NULL != pDataSrc)
   {
      pDataSrc->Initialize(pNMLV, this);
      pDataSrc->DelayRenderData(
         (CLIPFORMAT)RegisterClipboardFormat(_T("TIGroupFiles")));
      pDataSrc->DoDragDrop();
      pDataSrc->InternalRelease();
   }
}

如果您並未擁有 ole 處理您的資料來源,然後您要負責終結它,就如同任何典型的 C++ 物件。

如需詳細資訊,請參閱拖放剪貼簿,以及 操作資料物件和資料來源

請參閱

參考

COleDataObject 類別

COleDataSource 類別

概念

資料物件和資料來源 (OLE)