WINOLEAPI OleGetClipboard(IDataObject ** ppDataObj);
這個簡單的Windows API調用用來返回一個IDataObject,它提供用來一個乾淨地訪問WINDOWS粘貼板內容的好接口。注意,我們在本例中不需要實現IDataObject 接口,我們僅僅需要知道接口怎麼樣工作的,一個簡單的訪問粘貼板內容的程序如下:
#include <Windows.h>
#include <ObjBase.h>
#include <iostream>
using namespace std;
void DisplayDataObject(IDataObject *pDataObject)
{
FORMATETC fmtetc = {CF_TEXT,0,DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
STGMEDIUM stgmedium;
if(pDataObject->GetData(&fmtetc,&stgmedium) == S_OK)
{
char* data = (char*)GlobalLock(stgmedium.hGlobal);
cout<<data<<endl;
GlobalUnlock(stgmedium.hGlobal);
ReleaseStgMedium(&stgmedium);
}
}
int main()
{
if(OleInitialize(0)!= S_OK)
return 0;
IDataObject *pDataObject;
if(OleGetClipboard(&pDataObject) == S_OK)
{
DisplayDataObject(pDataObject);
pDataObject->Release();
}
OleUninitialize();
return 0;
}
上面的代碼演示了最常用的訪問IDataObject 的方法,數據通過調用IDataObject::GetData來請求,構造一個FORMATETC對象,它指定了想要訪問的數據的類型,在這個例子中,標準的CF_TEXT數據緩衝區以HGLOBAL內存對象來存儲。 數據返回到提供的STGMEDIUM結構體中,一旦我們鎖定並顯示數據,清理和調用標準的 ReleaseStgMedium API來釋放存儲在STGMEDIUM結構中的數據。 注意,代碼中僅僅當文本被選擇到粘貼板的時候才工作,也就是說,如果沒有CF_TEXT被存儲到粘貼板,粘貼板的IDataObject::GetData程序調用會失敗.什麼也不打印。