天天看点

VS2005编译DirectShow的问题与解决

安装DXSDK 后, 使用VC60编译生成strmbasd.lib等静态库都没有问题, 但在VS2005下使用这些静态库时, 编译不通过, 可能是由于编译器不同的原

因吧.

所以, 要VS2005工程使用DirectShow上的静态库, 应该先使用VS2005生成这些静态库.

使用VS2005打开DXSDK下DirectShow的BaseClass的工程, 经过转换进行编译, 编译报错:

error C2146: 语法错误 : 缺少“;”(在标识符“PVOID64”的前面)

问题说明:

用VS2005编译DirectShow baseclasses的问题。

打开winnt.h文件,发现问题就是在winnt.h头文件中无POINTER_64的定义造成的。

搜索vc下的头文件,发现在basetsd.h头文件中有POINTER_64的定义,而在winnt.h头文件中也包含了该头文件。

而在dxsdk9中也有basetsd.h头文件,而该文件无POINTER_64的定义,因此编译通不过。调整头文件搜索顺序后,编译也不行,

原来在VC6目录里也有basetsd.h头文件,而该文件无POINTER_64的定义。可能因为VC6的Include目录在系统变量include里有,所以改变VS中的头文件搜索顺序不能解

决问题。

最后我吧winnt.h中的#include <basetsd.h>改成"basetsd.h"就可以了。

unresolved external symbol "int __stdcall lstrlenWInternal(wchar_t const *)" 缺乏lib或者 lib版本不正确

(引用: http://freedomszp.spaces.live.com/blog/cns!767067FF9841D7D1!187.entry)

修改后, 后面报的错就只是语法上的问题了, 这里不说了.

// 比较详细的说明

http://blog.csdn.net/bwmwm/archive/2009/04/24/4106522.aspx

从网上下了DirectX 9.0 SDK,运行里面的的BaseClasses的时候出现了N多错误,在网上找到了相应的方法。就是上面那个链接啦,哈哈~~

   1. 编译基类源代码

   BaseClasses编译生成

路径:<DXSDK>/Samples/C++/DirectShow/BaseClasses

环境:VS2005

为了正确编译,需修改以下文件:

(a) ctlutil.h

D:/DXSDK/Samples/C++/DirectShow/BaseClasses/ctlutil.h

编译时提示错误:

BaseClasses/ctlutil.h(278) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

 修改:

    //operator=(LONG); //原代码

    COARefTime& operator=(LONG);

     改完这个之后,出现一堆错误,一个一个来改。

(b) wxdebug.cpp

d:/DXSDK/Samples/C++/DirectShow/BaseClasses/wxdebug.cpp

错误:

1>./wxdebug.cpp(567) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

改:

        //static g_dwLastRefresh = 0;

        static DWORD g_dwLastRefresh = 0; //lspmodify

(c) winutil.cpp

d:/DXSDK/Samples/C++/DirectShow/BaseClasses/winutil.cpp

错误:

1>./winutil.cpp(2104) : error C2065: “Count”: 未声明的标识符

改:

    //for (UINT  Count = 0;Count < Result;Count++) 

    UINT Count; //lspmodify

   for (Count = 0;Count < Result;Count++) { //lspmodify

(d) outputq.cpp

d:/DXSDK/Samples/C++/DirectShow/BaseClasses/outputq.cpp

错误:

1>./outputq.cpp(664) : error C2065: “iDone”: 未声明的标识符

改:

     //for (long  iDone = 0;

long iDone; //lspmodify

for (iDone = 0; //lspmodify

在DirectShow 8.0的SDK里面就看到有下面的头文件,在我装的是9.0的,没有找到这些文件。所以编译的时候修改完上面的就可以通过了。但要是装8.0的话就要修改了。

2、头文件修改

(a) winnt.h

d:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h

在该文件头部添加:

#define POINTER_64 __ptr64 // add by peter lee

(b) vmr9.h

D:/DXSDK/Include/vmr9.h

       MixerPref9_RenderTargetRGB      = 0x1000,

       MixerPref9_RenderTargetYUV      = 0x00002000, //lsp add

3、VS2005环境配置

在vs2005下,选择菜单 Tools -> Options,左栏选择Projects and Solutions -> VC++ Directories

在弹出的对话框的"Show directories for"(显示以下内容的目录)中选择Include files(包含文件):

- include:

<DXSDK>/Include

<DXSDK>/Samples/C++/Common/Include

<DXSDK>/Samples/C++/DirectShow/BaseClasses

<WMSDK>/WMFSDK9/include

...

再在"Show directories for"中选择 Libraries files(库文件):

- lib:

<DXSDK>/lib

<DXSDK>/Samples/C++/Common/Src

<DXSDK>/Samples/C++/DirectShow/BaseClasses/Debug_Unicode

<DXSDK>/Samples/C++/DirectShow/BaseClasses/Release_Unicode

<WMSDK>/WMFSDK9/lib

修改完成啦,哈哈~~~编译通过了~~ DirectX9.0 只需要做第一步修改就可以了,但8.0就要三步都做完~~~晕倒~~