2010年9月29日 星期三

設定class的const member初值

設計一個Circle類別,其中有成員常數PI。

class CCircle
{
protected:
    const double PI;

public:
    CCircle(void);
};

假如我在建構子以如下方式給定PI = 3.14159265的話

CCircle::CCircle(void)
{
    PI = 3.14159265;
}

在VS會產生error C2758: 'CCircle::PI' : must be initialized in constructor base/member initializer list

正確的寫法為

CCircle::CCircle(void) : PI(3.14159265)
{
}

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視窗出現了


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版本。
以前我使用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的子錄目下。正常情況下都會連結此目錄下的版本來使用。