Валиден ли такой код?
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 27.06.03 14:35
Оценка:
Пишу:


void DoSome(IHTMLElement2* pElement)
 {
   // deal with pElement

 }


IDispatch* pDisp = GetDispatch(); // for example

CComQIPtr<IHTMLElement2,&IID_IHTMLElement2> spElem(pDisp);
DoSome(spElem);


Собственно, интересуют выделенные строчки — не будет ли утечки интерфейсов? Или все прально сделано и можно так работать, не заморачиваясь над QueryInterface и Release?
Re: Валиден ли такой код?
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.06.03 14:39
Оценка:
Здравствуйте, Flamer, Вы писали:



F>CComQIPtr<IHTMLElement2,&IID_IHTMLElement2> spElem(pDisp);

F>DoSome(spElem);

F>[/ccode]

F>Собственно, интересуют выделенные строчки — не будет ли утечки интерфейсов? Или все прально сделано и можно так работать, не заморачиваясь над QueryInterface и Release?



Тут все сильно, дядя. Утечки тут могут быть в DoSome.
Re[2]: Валиден ли такой код?
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 27.06.03 14:43
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

PE>Здравствуйте, Flamer, Вы писали:




F>>CComQIPtr<IHTMLElement2,&IID_IHTMLElement2> spElem(pDisp);

F>>DoSome(spElem);

F>>[/ccode]

[]

PE>Тут все сильно, дядя. Утечки тут могут быть в DoSome.


Вопрос в другом — я так понимаю, в DoSome передается копия экземпляра CComQIPtr. В связи с этим никаких траблов?

З.Ы. Что именно понималось под "Утечки тут могут быть в DoSome"? Для переданного IHTMLElement2* Release надо делать? А нафик тогда CComQIPtr? Или я чего не понимаю?
Re: Валиден ли такой код?
От: Ахет  
Дата: 27.06.03 14:53
Оценка: -1
Здравствуйте, Flamer, Вы писали:


F>void DoSome(IHTMLElement2* pElement)

F> {
F> // deal with pElement
F> }

F>IDispatch* pDisp = GetDispatch(); // for example


может быть утечка в этой строчке.

F>IDispatchPtr pDisp = GetDispatch(); // for example


F>CComQIPtr<IHTMLElement2,&IID_IHTMLElement2> spElem(pDisp);

F>DoSome(spElem);

такой код не собереться нужно передавать:
1. IDispath*
2. использовать QueryInterface
3. передавать CComQIPtr<IHTMLElement2,&IID_IHTMLElement2>
4. либо воспользоваться всеми удобствами #import --> IHTMLElement2Ptr

F>Собственно, интересуют выделенные строчки — не будет ли утечки интерфейсов? Или все прально сделано и можно так работать, не заморачиваясь над QueryInterface и Release?


Эти от их спользования давно пока отказываться.
Re[3]: Валиден ли такой код?
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.06.03 14:54
Оценка: 20 (1)
Здравствуйте, Flamer, Вы писали:

F>Вопрос в другом — я так понимаю, в DoSome передается копия экземпляра CComQIPtr. В связи с этим никаких траблов?


У тебя же

void DoSome(IHTMLElement2* pElement)


Сюда передается IHTMLElement2*


F>З.Ы. Что именно понималось под "Утечки тут могут быть в DoSome"? Для переданного IHTMLElement2* Release надо делать? А нафик тогда CComQIPtr? Или я чего не понимаю?


Я же не вижу, что ты делаешь в DoSome. При пустоц реализации все сильно и утечек нет.
Re[4]: Валиден ли такой код?
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 27.06.03 14:56
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:


PE>Я же не вижу, что ты делаешь в DoSome. При пустоц реализации все сильно и утечек нет.


Ок, пасибки. Вопрос был именно в этом.
Re: Валиден ли такой код?
От: Alexmoon Украина  
Дата: 27.06.03 14:56
Оценка:
Здравствуйте, Flamer, Вы писали:

F>
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, как ни при исключительных ситуациях для надожного освобождения ресурсов. Да практически нигде.
Re[2]: Валиден ли такой код?
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 27.06.03 15:04
Оценка:
Здравствуйте, Alexmoon, Вы писали:

[]

A>Обычно при такой организации кода CComQIPtr тебе не зачем. Смарт поинтеры нужны в чаще всего в локальных процедурах, чтобы небыло как ты сказал утечки, а глобальные указатели вполне поддаются ручному контролю. Для глобальных указателей такие обертки, только расход ресурсов. Ну тебе еще понадобится CComQIPtr, как ни при исключительных ситуациях для надожного освобождения ресурсов. Да практически нигде.


Да я, в общем, вот про что:

всегда приятнее писать:

CComQIPtr<IHTMLElement2,&IID_IHTMLElement2> spElem(pDisp);
DoSome(spElem);


чем

IHTMLElement2* pElem = NULL;
if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLElement2,(void**)&pElem)))
 {
  DoSome(pElem);
  pElem->Release();
 }


Не находите? Вот я и задавал вопрос — идентичны ли в плане отсутствия утечек две конструкции (с учетом пустой функции DoSome)? Вроде убедили, что идентичны...
Re[3]: Валиден ли такой код?
От: Ахет  
Дата: 27.06.03 15:05
Оценка:
Здравствуйте, Flamer, Вы писали:

F>всегда приятнее писать:


F>
F>CComQIPtr<IHTMLElement2,&IID_IHTMLElement2> spElem(pDisp);
F>DoSome(spElem);
F>


F>чем


F>
F>IHTMLElement2* pElem = NULL;
F>if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLElement2,(void**)&pElem)))
F> {
F>  DoSome(pElem);
F>  pElem->Release();
F> }
F>


и даже чем
IHTMLElement2Ptr spElem(pDisp);
DoSome(spElem);

?

F>Не находите? Вот я и задавал вопрос — идентичны ли в плане отсутствия утечек две конструкции (с учетом пустой функции DoSome)? Вроде убедили, что идентичны...
Re[3]: Валиден ли такой код?
От: Alexmoon Украина  
Дата: 28.06.03 06:19
Оценка:
Здравствуйте, Flamer, Вы писали:

F>всегда приятнее писать:


F>
F>CComQIPtr<IHTMLElement2,&IID_IHTMLElement2> spElem(pDisp);
F>DoSome(spElem);
F>


F>чем


F>
F>IHTMLElement2* pElem = NULL;
F>if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLElement2,(void**)&pElem)))
F> {
F>  DoSome(pElem);
F>  pElem->Release();
F> }
F>


да вообщем то при разработке описание интерфейсов с помощью готовых объектов — это конечно хорошо и с некоторой стороны правильно.
Тем более, что CComQIPtr — это тот же указатель. Ведь он по моему только одно поле указателя на хранимый интерфейс и имеет. Так что скорее всего смарт поинтер себя в данном случае оправдывает, особенно когда очень не любишь писать слово Release.

Удачи.
Re: Валиден ли такой код?
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 28.06.03 07:42
Оценка:
Здравствуйте, Flamer, Вы писали:

[]

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?


Утечки интерфейсов не бывает. Есть проблемы с подсчетом ссылок, которые приводят к утечкам памяти.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.