![]() |
|
|
![]()
|
|
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Надо ли освобождать интерфейсы, полученные методами вроде
HRESULT IHTMLFrameBase2::get_contentWindow(IHTMLWindow2 **p); http://msdn.microsoft.com/en-us/library/aa752409 IHTMLDocument2::get_parentWindow() ; Очень хотелось бы найти обоснование из мсдна. |
|||
|
||||
| RastaDja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 337 Регистрация: 1.11.2010 Репутация: 1 Всего: 5 |
nerdy_weirdie если вы используете в качестве указателя CComPtr, то не надо.
Во всех остальных случаях - надо, так как по стандарту все методы get возвращают указатель и делают AddRef() перед возвратом. Тоесть освобождать обьект должен клиент. -------------------- The more closely you look at one thing, the less closely can you see something else. |
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Если использовать директиву #import или если заголовочные файлы сфоримрованы подобным образом, то велика вероятность того, что в них (в заголовочных файлах) будут объявлены врапперы на методы интерфейсов, которые будут возвращать значения (вместо HRESULT то, что указано последним параметром как [out, retval] или void) в виде смартпойнтера, которые дефайнятся в тех же файлах. Их высвобождать не надо. Также не надо освобождать, если используешь смартпойнторы напрямую, как сказал RastaDja. Во всех остальных случаях надо.
Добавлено через 3 минуты и 27 секунд Тут есть пример использования сгенерированных врапперов. -------------------- ![]() |
|||
|
||||
| nerdy_weirdie |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Смартпоинтеры не трогаем, с ними всё понятно.
я вот какую странную вещь наблюдаю:
На момент вызова Release() в деструкторе смартпоинтера pDisp, интерфейс уже оказывается освобожденным и вызов влечет эксепшн
Как такое может быть? где интерфейс успел освободиться? |
||||
|
|||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Сделай вместо этого просто QueryInterface -------------------- ![]() |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Как описан тип IHTMLDocument3Ptr ?
|
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
xvr, они, обычно, так описывают
Это стандартный смартпойнтер для COM объектов. Макросом дописывается Ptr. -------------------- ![]() |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
||||
|
||||
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Верно, этот тип унаследован от _com_ptr_t при помощи макроса _COM_SMARTPTR_TYPEDEF(IHTMLDocument3, __uuidof(HTMLDocument3)); В МСДНе написано что его конструктор вызывает QueryInterface() http://msdn.microsoft.com/en-us/library/41...v=vs.80%29.aspx |
|||
|
||||
| RastaDja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 337 Регистрация: 1.11.2010 Репутация: 1 Всего: 5 |
если что неправильно скажу, то извиняюсь заранее.
pHTMLDocument3 выходит из области видимости оператора if (pDisp != NULL ), поэтому удаляется, ведь он смартпоинтер -------------------- The more closely you look at one thing, the less closely can you see something else. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
А вот то, что его (pHTMLDocument3) извлекли не через QueryInteface - криминал |
|||
|
||||
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Через QueryInteface извлекли. Пруфлинк: http://msdn.microsoft.com/en-us/library/h3...v=vs.80%29.aspx
|
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Действительно. Тогда смотрите, что происходит в DoTheJob. Не позвали ли там случайно CoUninitialize или не загасили ли случайно WebBrowser Кстати -
|
||||
|
|||||
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
А происходит ли в этом случае утечка каких-либо ресурсов? Или они вместе с сервером освобождаются? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
||||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |