OleGetClipboard f函数 (ole2.h)

检索可用于访问剪贴板内容的数据对象。

语法

HRESULT OleGetClipboard(
  [out] LPDATAOBJECT *ppDataObj
);

参数

[out] ppDataObj

接收指向剪贴板数据对象的接口指针的 IDataObject 指针变量的地址。

返回值

此函数在成功时返回S_OK。 其他可能的值包括以下内容。

返回代码 说明
CLIPBRD_E_CANT_OPEN
在 OleFlushClipboard 中使用的 OpenClipboard 函数失败。
CLIPBRD_E_CANT_CLOSE
在 OleFlushClipboard 中使用的 CloseClipboard 函数失败。

注解

谨慎 剪贴板数据不受信任。 在应用程序中使用数据之前,请仔细分析数据。
 
如果要编写可接受剪贴板数据的应用程序,请调用 OleGetClipboard 函数以获取指向 IDataObject 接口的指针,该接口可用于检索剪贴板的内容。

OleGetClipboard 处理三种情况:

  • 使用 OleSetClipboard 函数将数据放置在剪贴板上的应用程序仍在运行。
  • 使用 OleSetClipboard 函数将数据放置在剪贴板上的应用程序随后调用 了 OleFlushClipboard 函数。
  • 剪贴板上有来自非 OLE 应用程序的数据。
在第一种情况下, OleGetClipboard 返回的剪贴板数据对象可以根据需要将调用转发到放置在剪贴板上的原始数据对象,因此,可能会进行 RPC 调用。

第二种情况下,OLE 创建默认数据对象并将其返回给用户。 由于剪贴板上的数据源自 OleSetClipboard 调用,因此 OLE 提供的数据对象包含有关剪贴板上数据类型的更准确信息。 具体而言,提供数据的原始介质 (TYMED) 是已知的。 因此,如果数据源应用程序在存储对象上提供特定的剪贴板格式(例如 cfFOO),并调用 OleFlushClipboard 函数,则会将存储对象复制到内存中,并将 hglobal 内存句柄放在剪贴板上。 然后,当 OleGetClipboard 函数创建其默认数据对象时,剪贴板中的 hglobal 将再次成为 IStorage 对象。 此外, FORMATETC 枚举器和 IDataObject::QueryGetData 方法都将正确指示原始剪贴板格式 (cfFOO) 在TYMED_ISTORAGE上再次可用。

在第三种情况下,OLE 仍会创建默认数据对象,但剪贴板格式中的数据 (没有特殊信息,尤其是应用程序定义的剪贴板格式) 。 因此,如果通过调用 SetClipboardData 函数直接将基于 hGlobal 的存储介质置于剪贴板上, 则 FORMATETC 枚举器以及 IDataObject::QueryGetData 方法不会指示数据在存储介质上可用。 但是,为TYMED_ISTORAGE调用 IDataObject::GetData 方法会成功。 由于这些限制,强烈建议 OLE 感知应用程序使用 OLE 剪贴板函数与剪贴板进行交互。

由 OleGetClipboard 函数创建的剪贴板数据对象具有相当广泛的 IDataObject 实现。 OLE 提供的数据对象可以将 OLE 1 剪贴板格式数据转换为 OLE 2 调用方预期的表示形式。 此外,任何结构化或平面介质上都提供任何结构化数据,而任何平面数据在任何平面介质上都可用。 但是, ((如图元文件和位图) )的 GDI 对象仅在其各自的介质上可用。

请注意, FORMATETC 枚举器中使用的 FORMATETC 结构的 tymed 成员包含受支持媒体的联合。 查找特定信息 ((例如CF_TEXT是否在 TYMED_HGLOBAL) 上可用)的应用程序应在检查此值时执行适当的位掩码。

如果调用 OleGetClipboard 函数,则应只保留返回的 IDataObject 很短的时间。 它使用提供它的应用程序中的资源。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 ole2.h
Library Ole32.lib
DLL Ole32.dll
API 集 Windows 10版本 10.0.15063 中引入了 ext-ms-win-com-ole32-l1-1-5 ()

另请参阅

OleSetClipboard