Здравствуйте 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. Люди! Читайте документацию по используемым компонентам! Сэкономите время и здоровье.