=============================================================
标题:列举Windows CE系统中注册的Filter
摘要:
备注:Windows CE + VC2005
日期:2010.8.9
姓名:朱铭雷
=============================================================
在用Platform Biulder 5.0定制的Windows CE 5.0系统中,能够支持多种媒体文件,这是因为定制系统的时候,加入了相关编解码组件。
下面来引用一段代码,枚举出Windows CE系统中注册的组件,其中有几个地方需要注意。
代码清单如下:
void CFilterTest1Dlg::OnBnClickedButton1()
{
HRESULT hr=0;
IFilterMapper *pMapper=NULL;
IEnumRegFilters *pEnum=NULL;
REGFILTER *pRegFilter=NULL;
ULONG cFetched=0;
CoInitialize(NULL);
hr=CoCreateInstance(CLSID_FilterMapper,NULL,CLSCTX_INPROC,IID_IFilterMapper,(void **)&pMapper);
if(FAILED(hr))
{
TRACE(L"得到IFilterMapper接口失败/n");
return;
}
hr=pMapper->EnumMatchingFilters(
&pEnum,
0,
FALSE,
GUID_NULL,
GUID_NULL,
FALSE,
FALSE,
GUID_NULL,
GUID_NULL
);
if(FAILED(hr))
{
TRACE(L"得到IEnumRegFilters接口失败/n");
return;
}
while(pEnum->Next(1,&pRegFilter,&cFetched)==S_OK)
{
for(int i=0;i<cFetched;i++)
{
TRACE(L"%S/n",(pRegFilter+i)->Name);
}
CoTaskMemFree(pRegFilter);
}
pMapper->Release();
pEnum->Release();
CoUninitialize();
}
然后添加一下#include <dshow.h>头文件。
编译可能会出现如下错误:
/ctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
解决方法:
project->properties->configuration->C/C++ ->Command Line,增加/wd4430选项
继续编译又可能会出现如下错误:
error LNK2001: 无法解析的外部符号 CLSID_FilterMapper
error LNK2001: 无法解析的外部符号 IID_IfilterMapper
fatal error LNK1120: 2 个无法解析的外部命令
这是因为没有连接必要的静态库。
解决方法:
链接器 | 输入 | 附加依赖项,填入strmiids.lib commdlg.lib。
再次编译,没有错误了。连接设备,测试一下程序。
打开“输出”窗口,看一下输出信息,如下:
我的系统中注册了如下Filter:
WMAudio Decoder DMO
WMVideo & MPEG4 Decoder DMO
MPEG-1 Layer 3 Decoder DMO
Video Renderer
Audio Renderer
Internal Script Command Renderer
WMSpeech Decoder DMO
NSC file Parser
ASF embedded stuff Handler
ASF URL Handler
ASF ICM Handler
ASF ACM Handler
ACM Wrapper
MPEG-I Stream Splitter
Windows Media source filter
Wave Parser
File-Rendering ‘Transform’
Multi-File Reader
M3U/ASXvl Playlist
ASXv3 Playlist
ASXv2 Playlist
File Source(URL)
File Source(Async.)
这些Filter直接影响系统能够播放哪些媒体文件。