Share via


OleGetClipboard 函式 (ole2.h)

擷取可用來存取剪貼簿內容的數據物件。

語法

HRESULT OleGetClipboard(
  [out] LPDATAOBJECT *ppDataObj
);

參數

[out] ppDataObj

接收剪貼簿數據物件介面指標的 IDataObject 指標變數位址。

傳回值

此函式會在成功時傳回S_OK。 其他可能的值包括下列專案。

傳回碼 Description
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
程式庫 Ole32.lib
Dll Ole32.dll
API 集合 ext-ms-win-com-ole32-l1-1-5 (Windows 10 10.0.15063 版)

另請參閱

OleSetClipboard