今天試著要build一個directshow的範例DMODemo結果卻跑出下面的error
C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\objidl.h(11280): error C2061: syntax error : identifier '__RPC__out_xcount_part'
一開始以為是用錯SDK的library,因此我把Platform設定改為Windows7.1SDK。不幸的是錯誤依舊。
__RPC__out_xcount_part 是定義在 rpcsal.h 之中,我試著檢查SDK v7.0A與v7.1目錄下的rpcsal.h,確定這2個.h檔都有定義__RPC__out_xcount_part,很明顯的是include到錯誤的目錄。當一個人的電腦灌了好幾種編譯器與SDK這個問題是常常發生的。
進一步磁碟搜尋後在另外2個目錄下發現rpcsal.h檔,分別是在 C:\Program Files\Microsoft DirectX SDK (June 2010)\Include 與 C:\Program Files\Microsoft DirectX SDK (November 2007)\Include 之中。
答案已呼之欲出,DirectX SDK (November 2007)下的rpcsal.h未定義__RPC__out_xcount_part,罪人就是這個檔案。
修改的方式有2種,第一種比較簡單:把專案中[Property Pages] → [Configuration Properties] → [C/C++] → [General] → [Additional Include Directory]原本的設定$(DXSDK_DIR)Include刪除。
或是修改系統的DXSDK_DIR路徑為
C:\Program Files\Microsoft DirectX SDK (June 2010)\Include\
第2種作法比較一勞永役,但系統必需重開才能生效,不過如果你希望預設的DX版本為2007 Nov版的話,就只能採用第一種改法。
2011年4月19日 星期二
2010年9月8日 星期三
安裝DirectShow 小技巧一
我經常開發一些DirectShow的Filter,在測試時就像開發COM元件使用ActiveX Control Test Container來測試元件的完整性一樣,完成的DirectShow Filter我會使用DirectShow SDK Filter Graph Editor來測試。
我們可以透過以下的方法,把GraphEdit放在Visual Studio 2010的選單中。
1. 點選Visual Studio 2010的選單[Tools] -> [External Tools...]
2. 點選後會出現[External Tools]對話盒,依圖中的1、2、3順序完成設定
(預設的路徑為C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\graphedt.exe)
3. 選單中多出了DirectShow SDK Filter Graph Editor的選項,點選後GraphEdit視窗出現了
我們可以透過以下的方法,把GraphEdit放在Visual Studio 2010的選單中。
1. 點選Visual Studio 2010的選單[Tools] -> [External Tools...]
2. 點選後會出現[External Tools]對話盒,依圖中的1、2、3順序完成設定
(預設的路徑為C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\graphedt.exe)
3. 選單中多出了DirectShow SDK Filter Graph Editor的選項,點選後GraphEdit視窗出現了
2010年9月2日 星期四
安裝DirectShow開發工具
如果你使用的工具是Visual Studio 2010或之後的版本,建議使用Windows SDK 7.0以後的版本。DirectShow目前已整合在SDK中,不像以前是DirectX的擴充元件。
微軟的版本可能會持續更新,在寫這篇文章時我所使用的是
Microsoft Windows SDK for Windows 7 and .NET Framework 4
依預設的下載安裝完成後,可以在
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow
找到DirectShow的範例程式。
完成安裝後的第一件事是建立BaseClasses Library,這個Library是以後要使用DirectShow時都會使用到的程式庫,裡面有許多已包裝好的類別可加速程式的開發。BaseClasses應該是安裝在
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses
可依以下方法建立
1. 使用Visual Studio 2010開啟baseclasses.vcproj專案。
2. 確認後會出現專案轉換精靈協助我們把專案轉為Visual Studio 2010的格式。
3. baseclasses包含有4種不同的設定,分別為:Debug、Debug_MBCS、Release、Release_MBCS。
Debug / Release與Debug_MBCS / Release_MBCS的差別在一個使用Unicode別一個使用Multi-Byte。我較習慣使用Multi-Byte,所以將建置Debug_MBCS與Release_MBCS版本。
理論上會出現2個編號 MSB8012的warning
這是因為VS2010的project proterty新增了TargetName的欄位,我嘗試用以下方式修正:
a. 從選單的[Project] -> [Properties]開啟properties視窗
b. 在[Configuration Properties] -> [General]中找到[Target Name]欄位
c. 將[Target Name]欄位中原本的$(ProjectName)改為strmbasd
d. 確定後重新執行[Build Solution]。
5. 改成Release_MBCS後依上面步驟,但將[Target Name]設為strmbase後執行[Build Solution]。
6. 你可以在專案的目錄下找到Debug_MBCS與Release_MBCS,而建立好的strmbasd.lib與strmbase.lib檔就放在其中。要特別注意,當連結使用DirectShow的baseclasses時是有分Debug與Release模式,若使用的是Debug設定,需連結strmbasd.lib反之使用strmbase.lib才能避免許多錯誤。
我在做完BaseClasses後通常會做2個步驟方便日後使用。
首先,我會把strmbasd.lib與strmbase.lib複製到C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib目錄下。
其次,我會在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include目錄下建立directshow\baseclasses子目錄,並且把baseclasses中所有的Header Files都複製到此目錄下。
會這麼做而不是直接連結到專案目錄,是因為我有時會追蹤baseclasses的一些行為而加入一些程式碼,為避免不穩定的情形所以把最原使可運作的Library與Header Files保持在v7.0A的子錄目下。正常情況下都會連結此目錄下的版本來使用。
微軟的版本可能會持續更新,在寫這篇文章時我所使用的是
Microsoft Windows SDK for Windows 7 and .NET Framework 4
依預設的下載安裝完成後,可以在
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow
找到DirectShow的範例程式。
完成安裝後的第一件事是建立BaseClasses Library,這個Library是以後要使用DirectShow時都會使用到的程式庫,裡面有許多已包裝好的類別可加速程式的開發。BaseClasses應該是安裝在
C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses
可依以下方法建立
1. 使用Visual Studio 2010開啟baseclasses.vcproj專案。
2. 確認後會出現專案轉換精靈協助我們把專案轉為Visual Studio 2010的格式。
3. baseclasses包含有4種不同的設定,分別為:Debug、Debug_MBCS、Release、Release_MBCS。
Debug / Release與Debug_MBCS / Release_MBCS的差別在一個使用Unicode別一個使用Multi-Byte。我較習慣使用Multi-Byte,所以將建置Debug_MBCS與Release_MBCS版本。
以前我使用Visual Studio 2005建立64-bit程式時發現,使用Unicode建立的程式在XP-64系統上執行都會出現模組錯誤的訊息無法執行,所以我會很習慣的都把專案改為Multi-Byte。4. 選擇Debug_MBCS後執行[Build Solution]
理論上會出現2個編號 MSB8012的warning
這是因為VS2010的project proterty新增了TargetName的欄位,我嘗試用以下方式修正:
a. 從選單的[Project] -> [Properties]開啟properties視窗
b. 在[Configuration Properties] -> [General]中找到[Target Name]欄位
c. 將[Target Name]欄位中原本的$(ProjectName)改為strmbasd
d. 確定後重新執行[Build Solution]。
5. 改成Release_MBCS後依上面步驟,但將[Target Name]設為strmbase後執行[Build Solution]。
6. 你可以在專案的目錄下找到Debug_MBCS與Release_MBCS,而建立好的strmbasd.lib與strmbase.lib檔就放在其中。要特別注意,當連結使用DirectShow的baseclasses時是有分Debug與Release模式,若使用的是Debug設定,需連結strmbasd.lib反之使用strmbase.lib才能避免許多錯誤。
我在做完BaseClasses後通常會做2個步驟方便日後使用。
首先,我會把strmbasd.lib與strmbase.lib複製到C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib目錄下。
其次,我會在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include目錄下建立directshow\baseclasses子目錄,並且把baseclasses中所有的Header Files都複製到此目錄下。
會這麼做而不是直接連結到專案目錄,是因為我有時會追蹤baseclasses的一些行為而加入一些程式碼,為避免不穩定的情形所以把最原使可運作的Library與Header Files保持在v7.0A的子錄目下。正常情況下都會連結此目錄下的版本來使用。
訂閱:
文章 (Atom)