前言:
由于 directshow的版本多,而Windows下用众多的开发工具:Visual C++、Visual Studio 2003/2005/2008。不同的directshow版本与开发工具组合起来就更混乱了,编译directshow应用程序时经常发生各种各样的错 误。而网上众说纷纭,往往都是片面之词,并不可信。
我则采众家之长,经过亲自实践,总结出一些文档出来:从directshow的版本说起,到
directshow在VC++6.0中头文件与库文件的配置,最后给出一个简单的播放器源码实例来验证所述配置是否正确。
全文内容 全面、具体、详细,是不可多得的一份参考文档!
一、版本选择
OS版本:Windows XP
DirectX SDK:DirectX9.0b SDK
DirectX9.0 SDK开发包版本较多,DirectX9.0b版本之前SDK包基本是完整的,DirectX9.0c 版本的SDK 包大多是升级包,里面并未附带DirectShow 部分,故不能单独使用。
开发平台:VC++ 6.0
DirectX9.0B+VC6.0是个很很好的选择。
二、编译基类BaseClasses源代码
有些程序需要引用BaseClasses相关内容,比如streams.h、strmbasd.lib、strmbase.lib。BaseClasses是DX目 录下的\Samples\C++\DirectShow\BaseClasses。
假设DX目录在C:\DXSDK下,打开baseclasses.dsw,点击运行(Ctrl+F5),通过Buid -> Set Active Configuration可在工程目录下分别生成四个库文件:
Debug版本: Debug\strmbasd.lib
Release版本:Release\STRMBASE.lib
Debug_Unicode版 本: Debug_Unicode\strmbasd.lib
Release_Unicode版本:Release_Unicode\STRMBASE.lib
将Debug_Unicode版本重命名为strmbasd_unicode.lib,将Release_Unicode版本重命名为STRMBASE_unicode.lib,然后这四个文件拷贝到DX的库目录下:C:\DXSDK\Lib。
三、添加DirectShow的头文件与库文件
将DirectX SDK的Include和Lib目 录配置到VC的系统目录中 去,并且放在标准的VC目录 之前,以保证编译器能够拿到最新版本的源文件。选择 Tools|Options|Directories,在弹出的对话框中的Show directories for中选择Include files,配置如下(DX安装在C:\DXSDK):
C:\DXSDK\Include
C:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE
再在Show directories for中选择Library files,配置如下:
C:\DXSDK\Lib
C:\Program Files\Microsoft Visual Studio\VC98\LIB
C:\Program Files\Microsoft Visual Studio\VC98\MFC\LIB
这里需要注意,我们将DX SDK的库路径设置到VC后,并不代表我们已设置好了DX SDK,在我们的DX工程中,我们还需要进行相应的设置操作,把我们所需要的库文件(DirectX SDK Library)加入到我们的工程中。要设置这个库文件有两个方 法,一个是在你工程的编译选项中进行添加,另外一种可以通过代码的方法来添加(推荐)。
DirectShow应用程序都应该包含Dshow.h文件,至少连 接库文件Strmiids.lib和Quartz.lib,但常常用Streams.h文件来代替Dshow.h。如果包含了Streams.h,则一般库文件另外还要连接uuid.lib和winmm.lib。
在程序中使用命令:
#include <dshow.h> //所有DirectShow应用程序必备
#pragma comment(lib,"strmiids.lib")
#pragma comment(lib,"quartz.lib")
#include <streams.h> //使用DirectShow基类
#pragma comment(lib,"uuid.lib")
#pragma comment(lib,"winmm.lib")
#ifdef _DEBUG
#ifdef UNICODE
#pragma comment(lib,"strmbasd_unicode.lib")
#else
#pragma comment(lib,"strmbasd.lib")
#endif // !UNICODE
#else /* release */
#ifdef UNICODE
#pragma comment(lib,"strmbase_unicode.lib")
#else
#pragma comment(lib,"strmbase.lib")
#endif // !UNICODE
#endif //release