IDataobject-> SetData не удалось - PullRequest
       15

IDataobject-> SetData не удалось

0 голосов
/ 22 апреля 2010

Я пытался использовать 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 голосов
/ 22 апреля 2010

Ну, после просмотра документации этого следует ожидать:

Возвращаемое значение

Если объект памяти все еще заблокирован после уменьшения счетчика блокировок, возвращаемое значение является ненулевым значением. Если объект памяти разблокирован после уменьшения счетчика блокировок, функция возвращает ноль, а GetLastError возвращает NO_ERROR.

Если функция завершается ошибкой, возвращаемое значение равно нулю, а GetLastError возвращает значение, отличное от NO_ERROR.

Так что ваше утверждение неверно; должно быть:

assert(GlobalUnlock(medium.hGlobal) == 0 && GetLastError() == NO_ERROR);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...