Разрушение замаршаленого объекта через 12 мин
От: alekss  
Дата: 07.04.03 08:29
Оценка:
Есть необходимость передать COM объект из одного апартмента в другой. Пишется обычная пара CoMarshalInterThr...() и CoGetInt...(). Проблема в том, что если поток, КУДА передается объект, прочитает его из стрима после истечения 12 мин с момента записи, то он получает CO_E_OBJNOTCONNECTED. Установка брейкпоинтов на Release показала что через 12 минут происходит нечто подобное CoReleaseMarshalData (освобождаются 3 ссылки, созданные в CoMarshal...()).

(12 минут — таймаут разрушения внешних ссылок при "потере" клиентских проксей).

Хочется понять, почему такое происходит, поскольку в Essential COM (MSDN) сказано что внешняя ссылка на stub manager держится не только проксями, но и замаршаленными интерфейсами.

A stub manager is created the first time CoMarshalInterface is called on a particular object identity. The stub manager holds outstanding references to the object it represents, and the stub manager stays alive as long as there is at least one outstanding external reference to the stub. These external references are usually proxies, although marshaled object references are counted as well, as they represent potential proxies.

PS. Хочется обойтись MSHLFLAGS_TABLE_XXXX, GIT и прочих наворотов.
PPS. CoLockObjectExternal почему-то не помогает.

--
Aleksey Karyakin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.