Здравствуйте, Ignoramus, Вы писали:
I>Позволю себе с Вами не согласиться. Пусть себе память переместилась, но хендл на память, который выделила GlobalAlloc(GMEM_MOVEABLE, ...) должен был остаться прежним. Тем более, что выделение и освобождение памяти происходит в одном процессе — метод IDataObject::GetData вызывается в принимающем приложении и ReleaseStgMedium там же.
I>Кроме того, мне кажется, исключение вылетает именно в случае если присутствует строка "delete this" в TUnknownForRelease::Release(). Без нее с hGlobal никаких проблем не появляется.
I>Более того, если этот хендл мог бы меняться, как Вы говорите, я тогда не представляю себе как должен работать механизм pUnkForRelease
Что он сможет сделать, если все изменилось и исходные хендлы потеряны на момент его активации?
Согласен. Но из кода, который был приведен, другое предположение и не последовало бы — там более-менее все в порядке. Единственное: nRefs обычно защищают при многопоточности и т.п. Раннее освобождение объекта было бы легко установить.
Через "delete this" в Release удаляется каждый (по крайней мере в ATL) СОМ объект, и никто не жалуется на вылет приложений из-за этого. Чаще "вылетают" при этом операторе, когда библиотека поддержки (по очистке ли ресурсов, при обращении к СОМу etc.) выгрузилась.