数据对象和数据源:创建和析构
遵循该文章 数据对象和数据源 (OLE)声明,数据对象和数据源表示传输的两侧。本文说明何时创建和销毁这些对象和源正确执行数据传输,包括:
创建数据对象
销毁的数据对象
创建数据源
销毁的数据源
创建数据对象
目标应用使用数据对象 --客户端或服务器。在目标应用的数据对象是连接的一端源应用程序和用途应用之间的。使用在目标应用的数据对象访问并将与数据源的数据进行交互。
具有数据对象所需的两种常见的情况。第一种情况是使用拖放,数据在应用程序中放置。第二种情况是粘贴或粘贴特定从 " 编辑 " 菜单中选择。
在拖放情况下,您不需要创建数据对象。对现有数据对象的指针将传递到您的 OnDrop 功能。此数据对象由结构创建的作为拖放操作过程中,将它还被销毁。,以便粘贴由另一个方法时,完成并不总是用例。有关更多信息,请参见 销毁的数据对象。
如果应用程序执行粘贴或粘贴具体措施时,应创建 COleDataObject 对象并调用其 AttachClipboard 成员函数。这会将数据对象与剪贴板上的数据。您在粘贴功能可使用此数据对象。
有关了如何实现此方法的示例,请参见 " 是 MFC OLE 示例 OCLIENT的 MAINVIEW.CPP 文件的 DoPasteItem 功能。OCLIENT 实现执行任何粘贴操作并调用从其 OnDrop、 OnPaste和 OnPasteLink 功能的 DoPasteItem 的函数。由于 OnDrop 有一个指向该数据对象传递给,它通过指向 DoPasteItem。OnPaste 和 OnPasteLink 通过 NULL 此参数,调用 DoPasteItem 创建数据对象并将其附加到剪贴板。此模式将代码粘贴,因此必须只调试它在一个位置,但是,您可以为和粘贴操作仍使用它。
销毁的数据对象
如果您按照 创建数据对象描述的模式,毁坏数据对象是数据传输的一个重要方面。在您的粘贴功能创建的数据对象将 MFC 销毁,则粘贴函数返回。
如果您遵循处理粘贴操作另一个方法,请确定毁坏数据对象,在您的操作完成后。直到毁坏数据对象,将无法才能所有应用程序能够成功将数据复制到剪贴板。
创建数据源
数据源的数据传输的源使用,可以是客户端或数据传输的服务器端。在源应用程序的数据源是连接的一端源应用程序和用途应用之间的。在目标应用的数据对象用于将与数据源的数据进行交互。
,当应用程序需要将数据复制到剪贴板时,数据源创建。一个典型方案按如下方式运行:
用户选择某些数据。
用户从 编辑 菜单中选择 复制 (或 剪切) 或启动拖放操作。
根据程序模型,应用程序创建一 COleDataSource 对象或对象从 COleDataSource派生的类。
选定的数据。 COleDataSource::CacheData 或 COleDataSource::DelayRenderData 组中插入到数据源中调用一个函数。
应用程序调用,如果这是拖放操作) 属于对象的 SetClipboard 成员函数 (或 DoDragDrop 成员函数创建在步骤。
如果这是 剪切 操作或 DoDragDrop 返回 DROPEFFECT_MOVE,在选择的数据步骤 1 从文档中删除。
此方案由 MFC OLE 示例 OCLIENT 和 HIERSVR实现。查看数据源为每个应用程序的 CView- 所有,但 GetClipboardData 和 OnGetClipboardData 功能的派生类。这两个函数在 COleClientItem 或 COleServerItem派生类实现。这些示例程序提供了一个很好的示例说明如何实现这些概念。
您可能希望创建 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++ 对象。
有关更多信息,请参见 拖放、 剪贴板和 操作数据对象和数据源。