vs2005下MFC调用Windows Media Player小结
由于尝试在wince(x86)下调用vlc来播放视频未果。所以,寄希望于调用Windows平台下自带的WindowsMediaPlayer(wmp)。因此这两天先尝试下在xp平台下调用wmp。
因为本人并不喜欢mfc,但是项目需要又只能硬着头皮上,这次调用wmp也走了个弯路。因此,这篇文章只起到总结和借鉴的作用。
基本环境:
vs2005
1.所走的弯路
本以为,mfc调用wmp跟调用vlc一样,简单的应用ActiveX插件,进行调用,方便省事。但是,发现其实调用的是wmp的 .ocx控件。这里的Activex插件和ocx控件是有写区别的。参见http://baike.baidu.com/view/393671.htm
因此,开始时,我参阅网上相关的网页操作方法如下:
- 安装WMP9
- VS2005创建mfc工程,名称如MP。
-
在资源视图中,右键“insert activex control...”,添加Windows Media Player控件。右击控件“add variable...”,指定变量名m_player。这时,你会发现工程中添加了两个文件,分别为:ocx1.h和ocx1.cpp文件。这时发现ocx1.h文件中只有变量的设定,而并没有对应的方法。并且在MPDlg.cpp文件中会有如下:void CMP1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_OCX1, m_player);
} - 继续按照网上的方法在solution explorer中右击"MP"->"add"->"class...",选择"MFC class From ActiveX Control".选择"registry"单选框,并选择"Windows Media Player<1.0>"。Location:c:\windows\system32\wmp.dll,之后将所有的接口文件加入到工程。
- ......
也许因为wmp版本问题或者其他什么原因,有些人可以通过上面的方法得到想要的结果。但是我没有成功。而下面是我得到正确的方法。
2.可行方法
- 首先将WMP9去除,并注册ocx。方法为:在"开始"-"运行"中:regsvr32 c:\windows\system32\wmp.dll /u ,卸载掉 9.0 版本 WindowsMediaPlayer, 然后,在在 PC 机的 [ 开始 ]-[ 运行 ] 里执行以下命令:regsvr32 c:\windows\system32\msdxm.ocx
- VS2005创建mfc工程,名称如MP1。
- 在资源视图中,右键“insert activex control...”,添加Windows Media Player控件。右击控件“add variable...”,指定变量名m_player。这时,你会发现工程中添加了两个文件,分别为:mediaplayer1.h和mediaplayer1.cpp文件。这时发现mediaplayer1.h文件中只有变量的设定,并有对应的方法。并且在MP1Dlg.cpp文件中会有如下:void CMP1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_MEDIAPLAYER1, m_player);
} - 在solution explorer中右击"MP"->"add"->"class...",选择"MFC class From ActiveX Control".选择"registry"单选框,并选择"Windows Media Player<1.0>"。Location:c:\windows\system32\msdxm.ocx,之后将IMediaPlayer2接口加入到工程。此时工程将出现CMediaPlayer2.h和.cpp文件。如图
- 然后在MP1Dlg.h中将m_player的类替换成CMediaPlayer2。
- 添加按钮:写入代码: char szFileFilter[]=
"Mp3 File(*.mp3)|*.mp3|"
"MPEG File(*.mpeg)|*.mpeg|"
"Media File(*.asf)|*.asf|"
"Video File(*.dat)|*.dat|"
"MPGA File(*.mpga)|*.mpga|"
"Wave File(*.wav)|*.wav|"
"AVI File(*.avi)|*.avi|"
"Movie File(*.mov)|*.mov|"
"Mid File(*.mid;*,rmi)|*.mid;*.rmi|"
"Wma File(*.wma)|*.wma|"
"All File(*.*)|*.*||";
CFileDialog fileDialog( TRUE,NULL,NULL,NULL,szFileFilter,this);
if (fileDialog.DoModal() == IDOK)
{
CString fileName=fileDialog.GetPathName();
fileName.MakeUpper();
m_player.put_FileName(fileName);
} - 运行。
3.至此,运行的程序就能选择文件并播放,也可以添加其他的功能,这里不多说。有个遗憾是,因为avi格式的压缩可能有多种格式,可能会出现不能播放或者只有声音未见图像的情况。