数据对象和数据源:创建和析构

遵循该文章 数据对象和数据源 (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. 应用程序调用,如果这是拖放操作) 属于对象的 SetClipboard 成员函数 (或 DoDragDrop 成员函数创建在步骤。

  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)