Re[3]: CComPtr и CComQIPtr
От: retalik www.airbandits.com/
Дата: 22.05.04 12:44
Оценка: 11 (2)
Здравствуйте, Nine, Вы писали:

N>1.Является ли сл. код аналогом предыдущего:


N>-----------------------------------------------

N>IGraphBuilder * m_pGraph;
N>IVideoWindow * pWindow;

N>CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,IID_IGraphBuilder, (void **) &pGraph);

N>m_pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &pWindow);
N>-----------------------------------------------
Почти является. Существенная разница: при выходе из области видимости классы CComPtr CComQIPtr сами вызовут Release(), а в данном примере нужно не забыть сделать это самостоятельно.
Кстати, если уж мы о DirectShow, маленький оффтопик: рекомендую установить DirectX Debug Runtime — при завершении программы будет выдаваться предупреждение обо всех "неубитых" объектах.

Еще одно замечание: в этом форуме есть тэги для оформления кода — с ними читать код гораздо удобнее.

N>2.В вашем ответе, разве m_pGraph не нужно создавать ф-ей CoCreateInstance???


N>CComPtr< IGraphBuilder > m_pGraph;

N>CComPtr< IVideoWindow> pWindow;
N>if(FAILED(m_pGraph->QueryInterface(&pWindow))
N> pWindow = 0;
Как-то создавать, конечно, нужно. Я привел эквивалент для данного кусочка:
CComPtr< IGraphBuilder > m_pGraph;
CComQIPtr< IVideoWindow, &IID_IVideoWindow > pWindow = m_pGraph;

, в котором тоже не было создания. Кстати, у классов *Ptr есть более удобный метод CoCreateInstance(), пользоваться рекомендуется им.

N>CComPtr< ISampleGrabber > m_pGrabber;

N>m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
N>CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );//???
N>//я так понимаю, что m_pGrabber передается конструктору в кач. параметра, но что это означает я так и не нашел.
То же самое. Создается "умный указатель" на интерфейс IBaseFilter путем вызова QueryInterface в конструкторе CComQIPtr.
Успехов,
Виталий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.