VS2010运行DirectShow的错误—typedef void * POINTER_64 PVOID64

来源:互联网 发布:移动和大数据 编辑:程序博客网 时间:2024/06/05 06:08

根据于老师给的link,

http://wiki.opencv.org.cn/index.php/%E4%BD%BF%E7%94%A8DirectShow%E9%87%87%E9%9B%86%E5%9B%BE%E5%83%8F#.E4.BE.8B.E7.A8.8B

编译Directshow代码时出现如下问题:

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

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

error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int


网路上查了些资料,总结下原因大概是:

打开winnt.h文件,发现问题就是在winnt.h头文件中无POINTER_64的定义造成的。搜索vc下的头文件,发现在basetsd.h头文件中有POINTER_64的定义,而在winnt.h头文件中也包含了该头文件。


尝试了几种解决方案:

Solution 1:

通过调整IDE 工具-> 选项-> 项目vc++目录包含文件include的顺序,将Platform SDK头文件目录放在Direct Show头文件目录前,使Direct Show需要的winnt.h所在文件夹在最上面。

Result:

这里尝试没有成功,问题依然存在,待解决,可能与Direct X不同。


Solution 2:

按照http://blog.sina.com.cn/s/blog_591a183f0100cahp.html的方法设置配置;
在command中添加/wd4430 

error C4430被fix,但是error C2146错误仍然存在,


Solution 3:
typedef void *PVOID; 
typedef void * POINTER_64 PVOID64; 
在它之前加下: 
#define POINTER_64 __ptr64 
Result:

有效,编译通过,更改winnt.h文件需要赋予管理员权限。


Solution 4: 
将winnt.h文件中的#include <basetsd.h>改为#include "basetsd.h"

Result:

有效,编译通过,更改winnt.h文件需要赋予管理员权限。


方案4是将包含文件更改,而方案3来是将未知类型define一个类型,我最后就用了4那么处理。

0 0