我也是個初學者,要是以下的文章有什麼錯誤,請給我留言,謝謝!
[1] 請確保您的機子上已經安裝了VS 2005和DirectX 9.0b SDK。DX9.0 SDK的就不寫了,自己在網上找吧!(我的DX9.0安裝在D盤根目錄下)
[2] 首先編譯SamplesC++DirectShowBaseClasses目錄下的baseclasses.sln以得到兩個庫檔案(strbase.lib和strmbase.lib)。以下介紹的主要是如何修改編譯中的錯誤,這也是眾多文章中沒有敘述的部分。自己寫的,有些囉嗦,請原諒哦!
進入DirectShow的安裝目錄,找到SamplesC++DirectShowBaseClasses,雙擊baseclasses.sln開啟該解決方案。首先看到的會是Visual Studio的轉換嚮導,不用管它,直接Next到Finish。
點擊F5,調試運行,你會見到下面的錯誤(至少我編譯的時候就是這樣的結果):
1>------ Build started: Project: BaseClasses, Configuration: Debug Unicode Win32 ------
1>Compiling...
1>dllentry.cpp
1>D:Program FilesMicrosoft Visual Studio 8VCPlatformSDKincludewinnt.h(222) : error C2146: syntax error : missing ';' before identifier 'PVOID64'
1>D:Program FilesMicrosoft Visual Studio 8VCPlatformSDKincludewinnt.h(222) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>D:Program FilesMicrosoft Visual Studio 8VCPlatformSDKincludewinnt.h(5940) : error C2146: syntax error : missing ';' before identifier 'Buffer'
1>D:Program FilesMicrosoft Visual Studio 8VCPlatformSDKincludewinnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>D:Program FilesMicrosoft Visual Studio 8VCPlatformSDKincludewinnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:DXSDKSamplesC++DirectShowBaseClassesctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:DXSDKincludeuuids.h : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss
1>Build log was saved at "file://d:DXSDKSamplesC++DirectShowBaseClassesDebug_UnicodeBuildLog.htm"
1>BaseClasses - 6 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
沒辦法,改錯。(網上老外的文章中說過,不過也不明白什麼意思!)
雙擊1>D:Program FilesMicrosoft Visual Studio 8VCPlatformSDKincludewinnt.h(222) : error C2146: syntax error : missing ';' before identifier 'PVOID64' 跳轉到出錯的位置。
你會見到錯誤語句:typedef void * POINTER_64 PVOID64;
這樣的定義,VS2005中是不支援的。將其修改為兩條語句:
#define POINTER_64 __ptr64
typedef void *PVOID;
typedef void *POINTER_64 PVOID64;
然後調試運行,會發現還有1條錯誤:
1>------ Build started: Project: BaseClasses, Configuration: Debug Unicode Win32 ------
1>Compiling...
1>dllentry.cpp
1>d:DXSDKSamplesC++DirectShowBaseClassesctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:DXSDKincludeuuids.h : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss
1>Build log was saved at "file://d:DXSDKSamplesC++DirectShowBaseClassesDebug_UnicodeBuildLog.htm"
1>BaseClasses - 1 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
只有繼續改啦!雙擊1>d:DXSDKSamplesC++DirectShowBaseClassesctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 跳轉到出錯的位置。
你會見到錯誤語句:operator=(LONG);
只是沒有傳回值嘛!給它加一個就行了,將其改為:LONG operate=(LONG);
再次調試運行,哇塞!更多錯誤:
1>------ Build started: Project: BaseClasses, Configuration: Debug Unicode Win32 ------
1>Compiling...
1>wxdebug.cpp
1>.wxdebug.cpp(534) : warning C4996: '_vsnwprintf' was declared deprecated
1> D:Program FilesMicrosoft Visual Studio 8VCincludestdio.h(450) : see declaration of '_vsnwprintf'
1> Message: 'This function or variable may be unsafe. Consider using _vsnwprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See _disibledevent="file:///d:DXSDKSamplesC++DirectShowBaseClassesDebug_UnicodeBuildLog.htm">file://d:DXSDKSamplesC++DirectShowBaseClassesDebug_UnicodeBuildLog.htm"
1>BaseClasses - 10 error(s), 2 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
有錯就改啦!雙擊1>.wxdebug.cpp(567) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 跳到出錯位置。
你會見到出錯語句:static g_dwLastRefresh = 0;
靜態類型變數有這麼定義的嗎?總得給個類型吧!將其改為:static DWORD g_dwLastRefresh = 0;為什麼類型指定為DWORD?看程式中的語句就明白了——保證相同類型的變數進行運算。
再次調試運行:
1>------ Build started: Project: BaseClasses, Configuration: Debug Unicode Win32 ------
1>Compiling...
1>winutil.cpp
1>.winutil.cpp(2104) : error C2065: 'Count' : undeclared identifier
1>.winutil.cpp(2106) : error C2228: left of '.peRed' must have class/struct/union
1>.winutil.cpp(2106) : error C2228: left of '.peRed' must have class/struct/union
1>.winutil.cpp(2107) : error C2228: left of '.peGreen' must have class/struct/union
1>.winutil.cpp(2107) : error C2228: left of '.peGreen' must have class/struct/union
1>.winutil.cpp(2108) : error C2228: left of '.peBlue' must have class/struct/union
1>.winutil.cpp(2108) : error C2228: left of '.peBlue' must have class/struct/union
1>.winutil.cpp(2124) : error C2228: left of '.peFlags' must have class/struct/union
1>outputq.cpp
1>.outputq.cpp(664) : error C2065: 'iDone' : undeclared identifier
1>Generating Code...
1>Build log was saved at "file://d:DXSDKSamplesC++DirectShowBaseClassesDebug_UnicodeBuildLog.htm"
1>BaseClasses - 9 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
錯誤少了一個哦!繼續努力!雙擊1>.winutil.cpp(2104) : error C2065: 'Count' : undeclared identifier跳到出錯位置。
你會見到出錯語句:for (Count = 0;Count < Result;Count++) {
Count沒有定義?看該語句上面的語句:
for (UINT Count = 0;Count < Result;Count++) {
if (SystemEntries[Count].peRed != pEntry[Count].peRed ||
SystemEntries[Count].peGreen != pEntry[Count].peGreen ||
SystemEntries[Count].peBlue != pEntry[Count].peBlue) {
bIdentityPalette = FALSE;
}
}
// And likewise compare against the last ten entries
Result = GetSystemPaletteEntries(hdc,PalHiStart,PalLoCount,SystemEntries);
看到了吧!Count是在迴圈體內定義的變數,出了迴圈之後就“生命”over了。所以將它定義到外面去。將以上的語句改為:
UINT Count = 0;
for (Count = 0;Count < Result;Count++) {
if (SystemEntries[Count].peRed != pEntry[Count].peRed ||
SystemEntries[Count].peGreen != pEntry[Count].peGreen ||
SystemEntries[Count].peBlue != pEntry[Count].peBlue) {
bIdentityPalette = FALSE;
}
}
// And likewise compare against the last ten entries
Result = GetSystemPaletteEntries(hdc,PalHiStart,PalLoCount,SystemEntries);
再次調試運行:
1>------ Build started: Project: BaseClasses, Configuration: Debug Unicode Win32 ------
1>Compiling...
1>winutil.cpp
1>outputq.cpp
1>.outputq.cpp(664) : error C2065: 'iDone' : undeclared identifier
1>Generating Code...
1>Build log was saved at "file://d:DXSDKSamplesC++DirectShowBaseClassesDebug_UnicodeBuildLog.htm"
1>BaseClasses - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
不錯哦!錯誤剩下一個了!再改,雙擊1>.outputq.cpp(664) : error C2065: 'iDone' : undeclared identifier
跳到出錯位置。
你會見到出錯語句:*nSamplesProcessed = iDone - iLost;
iDone沒有定義?OK,繼續看它上面的語句:
// Loop processing the samples in batches
LONG iLost = 0;
for (long iDone = 0;
iDone < nSamples || (m_nBatched != 0 && m_bSendAnyway);
) {
// ...
同樣的,將iDone的定義放到迴圈體的外面去,改為:
// Loop processing the samples in batches
LONG iLost = 0;
long iDone = 0;
for (iDone = 0;
iDone < nSamples || (m_nBatched != 0 && m_bSendAnyway);
) {
// ...
改完了以後,再次調試運行:
1>------ Build started: Project: BaseClasses, Configuration: Debug Unicode Win32 ------
1>Compiling...
1>outputq.cpp
1>Creating library...
1>Build log was saved at "file://d:DXSDKSamplesC++DirectShowBaseClassesDebug_UnicodeBuildLog.htm"
1>BaseClasses - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
總算見到succeeded了,呵呵!你調出來了嗎?
接著,產生所需要的那幾個庫檔案,步驟如下:
單擊VS2005功能表列中的Build-->Batch Build-->單擊彈出的Batch Build對話方塊中的Select All按鈕-->單擊Build按鈕。產生我們編程所需要的那兩個庫檔案:strbase.lib和strmbase.lib。
[3] 將DirectX SDK的Include和Lib目錄配置到VS2005的系統目錄中去,並且放在標準的VS2005目錄之前。步驟如下:
單擊VS2005功能表列上的Option(選項)-->單擊彈出的Option對話方塊中Projects and Solutions前的加號將其展開-->單擊VC++ Directories-->
(1) 在show directories for下拉式清單中選中Include files,然後添加下列路徑:
D:DXSDKInclude
D:DXSDKSAMPLESC++DIRECTSHOWBASECLASSES
D:DXSDKSAMPLESC++COMMONINCLUDE
(2) 在show directories for下拉式清單中選中library files,然後添加下列路徑:
D:DXSDKLib
D:DXSDKSamplesC++DirectShowBaseClassesDebug
D:DXSDKSamplesC++DirectShowBaseClassesDebug_Unicode
D:DXSDKSamplesC++DirectShowBaseClassesRelease
D:DXSDKSamplesC++DirectShowBaseClassesRelease_Unicode
路徑添加完成以後,別忘了點確定哦!
[4] 這一步只是簡單的介紹一下編程時需要附加什麼樣的庫檔案及如何添加。
DirectShow應用程式應該至少串連庫檔案strmiids.lib和quartz.lib。前者定義了DirectShow標準的CLSID和IID,後者定義了匯出函數AMGetErrorText(如果應用程式中沒有使用到這個函數,也可以不串連這個庫)。
如果程式裡包含了標頭檔streams.h,則一般庫檔案還要串連strmbasd.lib、uuid.lib、winmm.lib。
如果你不知道怎樣附加庫檔案的話,可以試下下述的步驟:
(1) 首先你得建立或開啟一個解決方案。
(2) 單擊VS2005功能表列中的Project-->XXX Properties-->彈出屬性設定對話方塊,展開Configuration Properties-->展開Linker-->單擊Input-->在右邊的Addtional Dependencies中添加庫。在每個庫檔案中以空格間隔。
例如:strbase.lib strmiids.lib
[5] 全部搞定了之後,你就可以放心的寫程式,偵錯工具了。加油哦!
部落格裡的第一篇文章,希望對初學者有些協助!共同進步哦!