DirectShow的配置问题

注:本文主要内容改编自互联网。感谢这些内容的原创者、Linxie以及Tao。

我的妈搞死我了。总结一下造福后来人。
首先,现在版本的DirectX并不包括DirectShow,如果光辛辛苦苦下了一个200MB+的DirectX SDK,然后郁闷地google为什么用不了DirectShow,请再去下一个4MB的DirectShow SDK先。
要使用DirectShow的大部分功能,需要编译它的一个sample(诡异啊诡异),位置在\Samples\C++\DirectShow\
这里就有一个叫baseclasses的工程,为安全起见,请先备份此工程。
1. 双击baseclasses.sln打开,按提示转换工程,编译。
提示错误:
1>D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(222) : error C2146: syntax error : missing ';' before identifier 'PVOID64'
1>D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(222) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(5940) : error C2146: syntax error : missing ';' before identifier 'Buffer'
1>D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\DX90SDK\Samples\C++\DirectShow\BaseClasses\ctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
第一类问题的解决:错误发生在:operator=(LONG);函数定义中,这是因为在VC6中,如果没有显示的指定返回值类型,编译器将其视为默认整形;但是vs2005不支持默认整形,解决这个问题不能修改每个没有显示指示返回值类型的函数地方,可以用wd4430来解决;具体的在工程选项中的c+ +/Command Line中添加/wd4430即可。
2. 在Tools->Options->Projects and solutions->vc++ directories->show directories for里选择include files
然后增加
DX90SDK\Include
DX90SDK\Samples\C++\DirectShow\BaseClasses
DX90SDK\Samples\C++\Common
可能会问题依旧,调整一下include files的顺序,把它们都放在最后。
然后在project->BaseClasses properties->configuration->C/C++ -> General->Additional Include Directories里面的内容(.,..\..\..\..\include)删掉,重新编译 ,PVOID64的错误消失,原因如下:
POINTER_64 是一个宏,在64位编译下起作用,它包含在SDK目录下的BASETSD.H中(Microsoft Visual Studio 8\VC\PlatformSDK\Include\basetsd.h(23):#define POINTER_64 __ptr64),但DXSDK自己也带了一个basetsd.h,里面没有定义POINTER_64,从而导致出错,只需要改变include files的优先级即可。当然,也可以改写winnt.h中的代码,在下面这两行:
typedef  void  *PVOID;
typedef  void  *POINTER_64  PVOID64;
之前增加一行:
#define  POINTER_64  __ptr64
3. 到目前为止,还剩下:
BaseClasses\ctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
这个错误,解决方法如下:
打开project->BaseClasses properties->configuration->C/C++ ->Command Line,增加/wd4430选项。
4. 接着编译,提示error C2065: 'Count' : undeclared identifier等等错误,这个是微软的历史遗留问题了,C++标准语法的问题,因为在之前在for循环内定义的变量可以在for之外的地方使用,即 在第一个for里for(int i,...),以后的for再使用i不必再声明,解决方法也很简单,打开project->BaseClasses properties->configuration- >C/C++->Language->Force Comformance in For Loop Scrope设置为No即可。当然,也可以手动改代码,增加一个声明就是了。
经过上面几个步骤,应该是可以顺利编译了,对于其它版本的工程,照样设置就可以了,总共编译出下面4个文件备用:
BaseClasses\Debug\strmbasd.lib
BaseClasses\Debug_Unicode\strmbasd.lib
BaseClasses\Release\STRMBASE.lib
BaseClasses\Release_Unicode\STRMBASE.lib
在lib里面加入
commctrl.lib
coredll.lib
strmiids.lib
strmbase.lib
uuid.lib
ole32.lib
commdlg.lib
你或许需要在Tools->Options->Projects and solutions->vc++ directories->show directories for->library files里把它们加进去。
赶快编译DX90SDK\Samples\C++\DirectShow\Players\PlayDMO工程试试看吧。

posted on 2010-02-05 17:04  grapeot  阅读(1333)  评论(0编辑  收藏  举报

导航