Hi,
I have an app using DirectShow. There I connect to ffdshow by this code
Code:
HRESULT hr = S_OK;
CComPtr<IBaseFilter> pH264 = NULL;
CComPtr<IUnknown> pIUnknown;
hr = CoCreateInstance(CLSID_FFDShow_Decoder, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pIUnknown);
RIF(hr);
hr = pIUnknown->QueryInterface(IID_IBaseFilter, (void**)&pH264);
RIF(hr);
it worked well, but this week I have tried to updated the ffdshow files to the last version. After it I get the error on pIUnknown->QueryInterface()
Code:
E_NOINTERFACE No such interface supported.
Why? Did not the last ffdshow support IBaseFilter?
PS. The new filter registration:
Code:
regsvr32 /u ffdshow.ax
regsvr32 ffdshow.ax
and new codes modification:
Code:
HRESULT hr = S_OK;
CComPtr<IBaseFilter> pH264 = NULL;
CComPtr<IBaseFilter> pAudioDecoder = NULL;
CComPtr<ICreateDevEnum> pSysDevEnum = NULL;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void **)&pSysDevEnum);
RIF(hr);
// Obtain a class enumerator for the video compressor category.
CComPtr<IEnumMoniker> pEnumCat = NULL;
hr = pSysDevEnum->CreateClassEnumerator(CLSID_LegacyAmFilterCategory, &pEnumCat, 0);
int nCountComplect = 0;
if (hr == S_OK)
{
// Enumerate the monikers.
CComPtr<IMoniker> pMoniker = NULL;
ULONG cFetched;
while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
{
CComPtr<IPropertyBag> pPropBag;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
(void **)&pPropBag);
if (SUCCEEDED(hr))
{
// To retrieve the filter's friendly name, do the following:
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
if (SUCCEEDED(hr))
{
// Display the name in your UI somehow.
if (_tcscmp(varName.bstrVal, L"ffdshow Video Decoder") == 0)
{
nCountComplect ++;
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
(void**)&pH264);
VariantClear(&varName);
RIF(hr);
hr = m_pGraph->AddFilter(pH264, L"FFDShowVideoDecoder");
RIF(hr);
if (nCountComplect == 2)
{
break;
}
else
{
pMoniker.Release();
continue;
}
}
else if (_tcscmp(varName.bstrVal, L"ffdshow Audio Decoder") == 0)
{
nCountComplect ++;
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
(void**)&pAudioDecoder);
VariantClear(&varName);
RIF(hr);
hr = m_pGraph->AddFilter(pAudioDecoder, L"FFDShowAudioDecoder");
RIF(hr);
if (nCountComplect == 2)
{
break;
}
else
{
pMoniker.Release();
continue;
}
}
}
VariantClear(&varName);
pMoniker.Release();
}
}
}
did not help.
Please any ideas.