Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В каких случаях интерфейс освобождать не надо, Release() 
:(
    Опции темы
nerdy_weirdie
Дата 23.1.2011, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Надо ли освобождать интерфейсы, полученные методами вроде
HRESULT IHTMLFrameBase2::get_contentWindow(IHTMLWindow2 **p);
http://msdn.microsoft.com/en-us/library/aa752409
IHTMLDocument2::get_parentWindow() ;
Очень хотелось бы найти обоснование из мсдна.

PM MAIL   Вверх
RastaDja
Дата 24.1.2011, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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.
PM MAIL   Вверх
Cheloveck
Дата 24.1.2011, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Если использовать директиву #import или если заголовочные файлы сфоримрованы подобным образом, то велика вероятность того, что в них (в заголовочных файлах) будут объявлены врапперы на методы интерфейсов, которые будут возвращать значения (вместо HRESULT то, что указано последним параметром как [out, retval] или void) в виде смартпойнтера, которые дефайнятся в тех же файлах. Их высвобождать не надо. Также не надо освобождать, если используешь смартпойнторы напрямую, как сказал RastaDja. Во всех остальных случаях надо.

Добавлено через 3 минуты и 27 секунд
Тут есть пример использования сгенерированных врапперов.


--------------------
user posted image
PM Jabber   Вверх
nerdy_weirdie
Дата 26.1.2011, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Смартпоинтеры не трогаем, с ними всё понятно.
я вот какую странную вещь наблюдаю:

Код

void Job(IWebBrowser2Ptr& pBrowser)
{
    IDispatchPtr pDisp = NULL;
    if (pBrowser)
    {
        HRESULT hr=pBrowser->get_Document(&pDisp);
        if (pDisp != NULL )
        {
            IHTMLDocument3Ptr pHTMLDocument3(pDisp);
            if (pHTMLDocument3)
            {
                DoTheJob(pHTMLDocument3);
            }
        }
    }
}

На момент вызова Release() в деструкторе смартпоинтера pDisp, интерфейс уже оказывается освобожденным и вызов влечет эксепшн
Код

First-chance exception at 0x7c812aeb in Test.exe: 0x80010108: Вызванный объект был отключен от клиентов.

Как такое может быть? где интерфейс успел освободиться?
PM MAIL   Вверх
Cheloveck
Дата 26.1.2011, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата(nerdy_weirdie @  26.1.2011,  07:53 Найти цитируемый пост)
IHTMLDocument3Ptr pHTMLDocument3(pDisp);

Сделай вместо этого просто QueryInterface


--------------------
user posted image
PM Jabber   Вверх
xvr
Дата 26.1.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Как описан тип IHTMLDocument3Ptr ?

PM MAIL   Вверх
Cheloveck
Дата 26.1.2011, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



xvr, они, обычно, так описывают
Код

_COM_SMARTPTR_TYPEDEF(IHTMLDocument3, __uuidof(HTMLDocument3));

Это стандартный смартпойнтер для COM объектов. Макросом дописывается Ptr.



--------------------
user posted image
PM Jabber   Вверх
xvr
Дата 26.1.2011, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Cheloveck @  26.1.2011,  15:00 Найти цитируемый пост)
Это стандартный смартпойнтер для COM объектов. 

Т.е. CComPtr<IHTMLDocument3>.
Тогда действительно неправильно, тут нужен CComQIPtr<IHTMLDocument3>

PM MAIL   Вверх
nerdy_weirdie
Дата 26.1.2011, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
RastaDja
Дата 26.1.2011, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



если что неправильно скажу, то извиняюсь заранее.

Цитата

IHTMLDocument3Ptr pHTMLDocument3(pDisp);

pHTMLDocument3 выходит из области видимости оператора if (pDisp != NULL ), поэтому удаляется, ведь он смартпоинтер


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 26.1.2011, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  26.1.2011,  17:20 Найти цитируемый пост)
pHTMLDocument3 выходит из области видимости оператора if (pDisp != NULL ), поэтому удаляется, ведь он смартпоинтер 
Это не страшно, т.к. выше есть еще один смартпоинтер (pDisp), который продолжает держать интерфейс.
А вот то, что его (pHTMLDocument3) извлекли не через QueryInteface - криминал



PM MAIL   Вверх
nerdy_weirdie
Дата 27.1.2011, 05:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Через QueryInteface извлекли. Пруфлинк: http://msdn.microsoft.com/en-us/library/h3...v=vs.80%29.aspx
PM MAIL   Вверх
xvr
Дата 27.1.2011, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(nerdy_weirdie @ 27.1.2011,  05:26)
Через QueryInteface извлекли. Пруфлинк: http://msdn.microsoft.com/en-us/library/h3...v=vs.80%29.aspx

Действительно. Тогда смотрите, что происходит в DoTheJob. Не позвали ли там случайно CoUninitialize или не загасили ли случайно WebBrowser
Кстати - 
Цитата

0x80010108: Вызванный объект был отключен от клиентов.
это RPC_E_DISCONNECTED - очень похоже как раз на 2й случай (умер удаленный COM сервер, сам объект то остался). 

PM MAIL   Вверх
nerdy_weirdie
Дата 27.1.2011, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Цитата(xvr @ 27.1.2011,  08:30)
это RPC_E_DISCONNECTED - очень похоже как раз на 2й случай (умер удаленный COM сервер, сам объект то остался).

А происходит ли в этом случае утечка каких-либо ресурсов? Или они вместе с сервером освобождаются?
PM MAIL   Вверх
xvr
Дата 27.1.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(nerdy_weirdie @  27.1.2011,  17:46 Найти цитируемый пост)
А происходит ли в этом случае утечка каких-либо ресурсов?
Может произойти

Цитата(nerdy_weirdie @  27.1.2011,  17:46 Найти цитируемый пост)
Или они вместе с сервером освобождаются?
Со стороны сервера - освобождаются. Со стороны клиента могут и застрять (до выхода из клиента)


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.