2010-04-22 33 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