您的位置:首页 > 其它

[DirectShow] 038 - Enumerating Filters

2009-08-20 20:22 253 查看
The Filter Graph Manager supports the IFilterGraph::EnumFilters

method, which enumerates all the filters in the filter graph. It returns a
pointer to the IEnumFilters

interface. The IEnumFilters::Next

method retrieves IBaseFilter

interface pointers.

Filter Graph Manger
支持
IFilterGraph::EnumFilters
方法用来枚举
filter graph
中的所有
filter
。这个函数返回
IEnumFilters
接口的指针。
IEnumFilters::Next
方法返回
IBaseFilter
接口指针。

The following example shows a function that enumerates the filters
in a graph and displays a message box with each filter's name. It uses the IBaseFilter::QueryFilterInfo

method to retrieve the name of the filter. Note the places where the function
calls Release
on an interface to decrement the reference count.

下面的列子展现枚举
graph

filter
的方法并在一个消息框中显示每个
filter
名字。使用
IBaseFilter::QueryFilterInfo
方法获得
filter
的名字。记得调用
Release
来消耗应用计数。

HRESULT EnumFilters (IFilterGraph *pGraph)
{
IEnumFilters *pEnum = NULL;
IBaseFilter *pFilter;
ULONG cFetched;
HRESULT hr = pGraph->EnumFilters(&pEnum);
if (FAILED(hr)) return hr;
while(pEnum->Next(1, &pFilter, &cFetched) == S_OK)
{
FILTER_INFO FilterInfo;
hr = pFilter->QueryFilterInfo(&FilterInfo);
if (FAILED(hr))
{
MessageBox(NULL, TEXT("Could not get the filter info"),
TEXT("Error"), MB_OK | MB_ICONERROR);
continue;  // Maybe the next one will work.
}
#ifdef UNICODE
MessageBox(NULL, FilterInfo.achName, TEXT("Filter Name"), MB_OK);
#else
char szName[MAX_FILTER_NAME];
int cch = WideCharToMultiByte(CP_ACP, 0, FilterInfo.achName,
MAX_FILTER_NAME, szName, MAX_FILTER_NAME, 0, 0);
if (chh > 0)
MessageBox(NULL, szName, TEXT("Filter Name"), MB_OK);
#endif
// The FILTER_INFO structure holds a pointer to the Filter Graph
// Manager, with a reference count that must be released.
if (FilterInfo.pGraph != NULL)
{
FilterInfo.pGraph->Release();
}
pFilter->Release();
}
pEnum->Release();
return S_OK;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: