Re[8]: DirectShow & video capture
От: Snax Россия  
Дата: 12.09.02 23:58
Оценка:
Здравствуйте scs, Вы писали:

scs>Ниже будет приведен код создания графа в общем виде, он содержат вспомогательные функции:


scs>
scs>// Функция находит фильтр по имени в system device enumerator и возвращает его.
scs>// Параметры: [in]  CComBSTR& bstrFilterName      - имя фильтра
scs>//            [out] CComPtr<IBaseFilter>& pFilter - найденный фильтр
scs>//            [in]  REFCLSID clsidDeviceClass     - CLSID категории фильтра (см. DS SDK)
scs>HRESULT GetFilter(CComBSTR& bstrFilterName, CComPtr<IBaseFilter>& pFilter, REFCLSID clsidDeviceClass)
scs>{
scs>    HRESULT hr;

scs>    CComQIPtr<ICreateDevEnum, &IID_ICreateDevEnum> spSysDevEnum;
scs>    hr = spSysDevEnum.CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC);
scs>    if (SUCCEEDED(hr))
scs>    {
scs>        CComPtr<IEnumMoniker> pEnum;

scs>        hr = spSysDevEnum->CreateClassEnumerator(clsidDeviceClass, &pEnum, 0);
scs>        if (SUCCEEDED(hr))
scs>        {
            // почикано
scs>        }
scs>    }

scs>    return hr;
scs>}
scs>


Внимание, вопрос! Что вернет ICreateDevEnum::CreateClassEnumerator() если в конкретной
системе нет ни одного фильтра этой категории? Правильно, S_FALSE. И NULL в ppEnumMoniker!!!

Так что выделенный выше код нужно бы заменить на

        hr = spSysDevEnum->CreateClassEnumerator(clsidDeviceClass, &pEnum, 0);
        if (S_OK == hr))
        {
            // почикано
        }


Иначе застрелится при первом же вызове pEnum->Next().

Кроме того, в документации по IEnumXXXX рекомендуют вызывать IEnumXXXX::Reset() до первого
IEnumXXXX::Next(). Хотя в данном случае это не актуально.

Павел.
P.S. Люди! Читайте документацию по используемым компонентам! Сэкономите время и здоровье.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.