Здравствуйте, 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.