void DoSome(IHTMLElement2* pElement)
{
// deal with pElement
}
IDispatch* pDisp = GetDispatch(); // for exampleCComQIPtr<IHTMLElement2,&IID_IHTMLElement2> spElem(pDisp);
DoSome(spElem);
Собственно, интересуют выделенные строчки — не будет ли утечки интерфейсов? Или все прально сделано и можно так работать, не заморачиваясь над QueryInterface и Release?
F>CComQIPtr<IHTMLElement2,&IID_IHTMLElement2> spElem(pDisp); F>DoSome(spElem); F>[/ccode]
F>Собственно, интересуют выделенные строчки — не будет ли утечки интерфейсов? Или все прально сделано и можно так работать, не заморачиваясь над QueryInterface и Release?
Тут все сильно, дядя. Утечки тут могут быть в DoSome.
[]
PE>Тут все сильно, дядя. Утечки тут могут быть в DoSome.
Вопрос в другом — я так понимаю, в DoSome передается копия экземпляра CComQIPtr. В связи с этим никаких траблов?
З.Ы. Что именно понималось под "Утечки тут могут быть в DoSome"? Для переданного IHTMLElement2* Release надо делать? А нафик тогда CComQIPtr? Или я чего не понимаю?
такой код не собереться нужно передавать:
1. IDispath*
2. использовать QueryInterface
3. передавать CComQIPtr<IHTMLElement2,&IID_IHTMLElement2>
4. либо воспользоваться всеми удобствами #import --> IHTMLElement2Ptr
F>Собственно, интересуют выделенные строчки — не будет ли утечки интерфейсов? Или все прально сделано и можно так работать, не заморачиваясь над QueryInterface и Release?
Здравствуйте, Flamer, Вы писали:
F>Вопрос в другом — я так понимаю, в DoSome передается копия экземпляра CComQIPtr. В связи с этим никаких траблов?
У тебя же
void DoSome(IHTMLElement2* pElement)
Сюда передается IHTMLElement2*
F>З.Ы. Что именно понималось под "Утечки тут могут быть в DoSome"? Для переданного IHTMLElement2* Release надо делать? А нафик тогда CComQIPtr? Или я чего не понимаю?
Я же не вижу, что ты делаешь в DoSome. При пустоц реализации все сильно и утечек нет.
F>void DoSome(IHTMLElement2* pElement)
F> {
F> // deal with pElement
F> }
F>IDispatch* pDisp = GetDispatch(); // for example
F>CComQIPtr<IHTMLElement2,&IID_IHTMLElement2> spElem(pDisp);
F>DoSome(spElem);
F>
F>Собственно, интересуют выделенные строчки — не будет ли утечки интерфейсов? Или все прально сделано и можно так работать, не заморачиваясь над QueryInterface и Release?
Обычно при такой организации кода CComQIPtr тебе не зачем. Смарт поинтеры нужны в чаще всего в локальных процедурах, чтобы небыло как ты сказал утечки, а глобальные указатели вполне поддаются ручному контролю. Для глобальных указателей такие обертки, только расход ресурсов. Ну тебе еще понадобится CComQIPtr, как ни при исключительных ситуациях для надожного освобождения ресурсов. Да практически нигде.
[]
A>Обычно при такой организации кода CComQIPtr тебе не зачем. Смарт поинтеры нужны в чаще всего в локальных процедурах, чтобы небыло как ты сказал утечки, а глобальные указатели вполне поддаются ручному контролю. Для глобальных указателей такие обертки, только расход ресурсов. Ну тебе еще понадобится CComQIPtr, как ни при исключительных ситуациях для надожного освобождения ресурсов. Да практически нигде.
Не находите? Вот я и задавал вопрос — идентичны ли в плане отсутствия утечек две конструкции (с учетом пустой функции DoSome)? Вроде убедили, что идентичны...
?
F>Не находите? Вот я и задавал вопрос — идентичны ли в плане отсутствия утечек две конструкции (с учетом пустой функции DoSome)? Вроде убедили, что идентичны...
да вообщем то при разработке описание интерфейсов с помощью готовых объектов — это конечно хорошо и с некоторой стороны правильно.
Тем более, что CComQIPtr — это тот же указатель. Ведь он по моему только одно поле указателя на хранимый интерфейс и имеет. Так что скорее всего смарт поинтер себя в данном случае оправдывает, особенно когда очень не любишь писать слово Release.
[]
F>IDispatch* pDisp = GetDispatch(); // for example
GetDisptach — по идее, должна сделать AddRef прежде чем отдать указатель.
F>CComQIPtr<IHTMLElement2,&IID_IHTMLElement2> spElem(pDisp);
Все хорошо, но лучше писать
if (spElem)
DoSome(spElem);
При выходе из области видимости — смарт-поинтер сделает Release, а вот о pDisp нужно позаботиться самому (если GetDispatch() делает AddRef).
F>Собственно, интересуют выделенные строчки — не будет ли утечки интерфейсов? Или все прально сделано и можно так работать, не заморачиваясь над QueryInterface и Release?
Утечки интерфейсов не бывает. Есть проблемы с подсчетом ссылок, которые приводят к утечкам памяти.