共用方式為


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

按照本文章 資料物件和資料來源 (OLE)所說明,資料物件和資料來源表示資料傳輸的兩方。 本文時說明何時建立和終結這些物件和適當地執行您的資料傳輸的來源,包括:

  • 建立資料物件

  • 終結資料物件

  • 建立資料來源

  • 終結資料來源

建立資料物件

接收端應用程式使用資料物件—用戶端或伺服器。 在接收端應用程式的資料物件是來源應用程式和接收端應用程式之間連接的一端。 在接收端應用程式的資料物件與資料來源中的資料存取和互動。

有兩種常見的情況需要資料物件。 第一種情況是使用拖放方式,往應用程式放入資料。 第二種情況是於功能表中選取貼上或選擇性貼上編輯。

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

如果應用程式執行貼上或選擇性貼上動作,您應該建立 COleDataObject 物件並呼叫它的 AttachClipboard 成員函式。 這讓資料物件與剪貼簿上的資料相關聯。 您即可以使用這個資料物件於貼上函式。

如需有關這個如何進行,請參閱 MFC OLE OCLIENT範例的一部分的 MAINVIEW.CPP 檔案的 DoPasteItem 函式。 OCLIENT 實作執行任何貼上作業並呼叫它的 OnDropOnPasteOnPasteLink 函式的 DoPasteItem 的函式。 由於 OnDrop 有指標資料物件傳遞給它,它將指標傳遞給 DoPasteItemOnPasteOnPasteLink 傳遞 NULL 至這個參數,告訴 DoPasteItem 建立資料物件和附加至剪貼簿。 這個配置分隔您的貼上程式碼,因此您只需要偵錯一個地方,不過,您仍可以為兩種貼上作業使用它。

終結資料物件

如果您遵循 建立資料物件中描述的配置,終結資料物件是資料傳輸的一個必然方面。 當您的貼上函式傳回,在您的貼上函式建立資料物件會被 MFC 終結。

如果您按照處理貼上作業的其他方法,請判斷在貼上作業完成之後資料物件是否已終結。 直到終結資料物件,將無法進行任何應用程式順利複製資料到剪貼簿。

建立資料來源

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

當應用程式需要資料複製到剪貼簿時,資料來源建立。 一般的案例會像這樣:

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

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

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

  4. 選取的資料呼叫在 COleDataSource::CacheDataCOleDataSource::DelayRenderData 群組中的其中一個函式插入資料來源。

  5. 應用程式會呼叫屬於在第 3. 步驟建立之物件的 SetClipboard 成員函式 (或如果為拖放作業, DoDragDrop 成員函式)。

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

這個案例由 MFC OLE、MFC 範例 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)