IDataobject-> SetData失败

时间:2010-04-22 12:45:16

标签: c++ windows com

我尝试使用IDataObject将一些文本放到剪贴板中。但GlobalUnlock失败了。我做错了什么?

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));

1 个答案:

答案 0 :(得分:0)

嗯,看完documentation之后,这是预期的:

  

返回值

     

如果在减少锁定计数后内存对象仍然锁定,则返回值为非零值。如果在减少锁定计数后内存对象被解锁,则该函数返回零并且GetLastError返回NO_ERROR。

     

如果函数失败,则返回值为零,GetLastError返回NO_ERROR以外的值。

所以你的断言是错的;它应该是:

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