typedef struct
{
CLIPFORMAT cfFormat; // 粘贴板格式
DVTARGETDEVICE *ptd; // (NULL) rendering的目标设备
DWORD dwAspect; // (DV_CONTENT) rendering的详细程度
LONG lindex; // (-1) 在数据通过页面边界分割的时候使用
DWORD tymed; // 用于数据传输的存储媒体(HGLOBAL,IStream)
} FORMATETC;
typedef struct
{
DWORD tymed;
union
{
HBITMAP hBitmap;
HMETAFILEPICT hMetaFilePict;
HENHMETAFILE hEnhMetaFile;
HGLOBAL hGlobal;
LPWSTR lpszFileName;
IStream *pstm;
IStorage *pstg;
};
IUnknown *pUnkForRelease;
} STGMEDIUM;
IDataObject方法
|
描述
|
GetData
|
Render在FORMATETC结构体中描述的数据,并通过STGMEDIUM结构体来传递数据
|
GetDataHere
|
Render在FORMATETC结构体中的数据,并通过调用者分配的STGMEDIUM结构体传输数据。
|
QueryGetData
|
判断数据对象是否可以render在FORMATETC结构中描述的数据
|
GetCanonicalFormatEtc
|
提供一个潜在不同的但逻辑上相同的FORMATETC结构体。
|
SetData
|
提供一个通过FORMATECT结构和STGMEDIUM结构描述的源数据对象。
|
EnumFormatEtc
|
创建并返回一个IEnumFORMATETC接口的指针来枚举数据对象支持的FORMATETC对象。
|
DAdvise
|
创建一个在数据对象和通知接收器之间的连接,因此通知接收器能接收到数据对象中通知的改变。
|
DUnadvise
|
销毁一个前面使用DAdvise方法安装的通知
|
EnumDAdvise
|
创建和返回一个指向枚举当前通知连接的接口指针。
|
WINOLEAPI OleGetClipboard(IDataObject ** ppDataObj);
#include <windows.h>
int main(void)
{
IDataObject *pDataObject;
// Initialize COM and OLE
if(OleInitialize(0) != S_OK)
return 0;
// Access the data on the clipboard
if(OleGetClipboard(&pDataObject) == S_OK)
{
// access the IDataObject using a separate function
DisplayDataObject (pDataObject);
pDataObject->Release();
}
// Cleanup
OleUninitialize();
return 0;
}
void DisplayDataObject(IDataObject *pDataObject)
{
FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stgmed;
// ask the IDataObject for some CF_TEXT data, stored as a HGLOBAL
if(pDataObject->GetData(&fmtetc, &stgmed) == S_OK)
{
// 我们必须锁定HGLOBAL句柄,因为我们不能确信这是否是一个GEM_FIXED数据
char *data = GlobalLock(stgmed.hGlobal);
printf("%s/n", data);
// cleanup
GlobalUnlock(stgmed.hGlobal);
ReleaseStgMedium(&stgmed);
}
}