2010-04-22 88 views
0

我試圖用IDataObject把一些文本放到剪貼板。但GlobalUnlock失敗。我做錯了什麼?IDataobject-> SetData失敗

IDataObject *obj; 
HRESULT ret; 
assert(S_OK == OleGetClipboard(&obj)); 

FORMATETC fmtetc = {0}; 
fmtetc.cfFormat = CF_TEXT; 
fmtetc.dwAspect = DVASPECT_CONTENT; 
fmtetc.lindex = -1; 
fmtetc.tymed = TYMED_HGLOBAL; 

STGMEDIUM medium = {0}; 
medium.tymed = TYMED_HGLOBAL; 
char* str = "string"; 

medium.hGlobal = GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, strlen(str)+1); 
char* pMem = (char*)GlobalLock(medium.hGlobal); 
strcpy(pMem,str); 
assert(GlobalUnlock(medium.hGlobal) != 0); // !!! ERROR 
assert(S_OK == obj->SetData(&fmtetc,&medium,TRUE)); 
assert(S_OK == OleSetClipboard(obj)); 
+0

那麼,當GlobalUnlock()失敗時,什麼是GetLastError()?另外,你確定GlobaAlloc()和GlobalLock()是否成功? – Luke 2010-04-22 17:18:22

+0

GetLastError失敗時不包含任何信息。而且,alloc/lock沒有問題。 – trudger 2010-04-22 18:39:40

回答

0

好,看着documentation後,這是可以預料到:

返回值

如果內存對象遞減鎖定計數後仍然鎖定,返回值是一個非零值。如果在減少鎖定計數後內存對象被解鎖,則該函數返回零,並且GetLastError返回NO_ERROR。

如果函數失敗,則返回值爲零,並且GetLastError返回非NO_ERROR值。

所以你的斷言是錯誤的;它應該是:

assert(GlobalUnlock(medium.hGlobal) == 0 && GetLastError() == NO_ERROR); 
+0

我是多麼愚蠢,我已經糾正它。但SetData仍然失敗。它返回E_FAIL,GetLastError返回0.實際上,我可以使用OleGetClipboard來獲取寫入接口嗎? – trudger 2010-04-23 03:09:24

+0

我終於決定使用Windows API SetClipboardData。這很容易。 – trudger 2010-04-23 09:30:03