天天看點

VS2010運作DirectShow的錯誤—typedef void * POINTER_64 PVOID64

根據于老師給的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那麼處理。

繼續閱讀