Re[10]: Повторный CoGetInterfaceAndReleaseStream
От: Alexander G Украина  
Дата: 10.04.17 20:31
Оценка: 9 (1)
Здравствуйте, Aniskin, Вы писали:

AG>>При этом, код в 7z.dll также как-то связан и с дополнительным потоком?


A>Дополнительный поток создается в 7z.dll, такая у него архитектура. В этом дополнительном потоке 7z.dll вызывает callback функцию для получения файлового потока, которые нужно упаковать.


Вот оно что.

Предполагаю, что для ан-маршаллинга требуется обработать входящий COM-вызов в маршаллящем потоке.
Для такого обычно используют CoWaitForMultipleHandles вместо обычных Wait-функций.

Поскольку 7z.dll не будет использовать CoWaitForMultipleHandles, предлагаю в своём IDropTarget::Drop стартовать свой поток, который уже вызовет ту самую функцию из 7z.dll, и этот свой поток тут же ждать через CoWaitForMultipleHandles.

A>При этом сам дополнительный поток имеет не инициализированный COM, и вызов CoInitialize произвожу я в callback функции.


Ну это ничего, только, разумеется, CoUninitialize следует вызвать до возврата из callback функции, и к моменту этого вызова CoUninitialize не должно быть ссылок на COM интерфейсы, полученные в callback-функции.
Русский военный корабль идёт ко дну!
Отредактировано 10.04.2017 20:33 Alexander G . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.