VS2008下安裝與配置DirectShow SDK 9.0 及 DirectShow AMCap改裝的問題
一、 安裝DirectShow。
我裝的是DirectShow SDK 9.0b。安裝程序名為DXSDK_Jun10.exe。
下載地址:https://pan.baidu.com/s/1kURma3t
下載地址:https://pan.baidu.com/s/1slfmSMD
? ?
? ?
二、 準備需要的靜態鏈接庫。
需要的靜態鏈接庫有strmiids.lib、strmbasd.lib、strmbase.lib、quartz.lib、winmm.lib。
其中strmiids.lib、quartz.lib在
進入D:\ DXSDK\Samples\C++\DirectShow\BaseClasses文件夾下,雙擊baseclasses.sln。
按F7開始編譯。
修改一些編譯錯誤:
1、 error C2146: 語法錯誤 : 缺少";"(在標識符"PVOID64"的前面)。
修改:在"typedef void * POINTER_64 PVOID64;"前面加上"#define POINTER_64 __ptr64"。
2、 error C4430:
修改:把"operator=(LONG);"改成"LONG operator=(LONG);"。
修改:把"static g_dwLastRefresh = 0;"改成"static DWORD g_dwLastRefresh = 0;"。
3、error C2065: "Count": 未聲明的標識符。
修改:在"for (UINT Count = 0;Count < Result;Count++) "語句前面加上"UINT Count = 0",再把"for (UINT Count = 0;Count < Result;Count++) "
4、 error C2065: "iDone": 未聲明的標識符。
修改:在"for (long iDone = 0;iDone < nSamples || (m_nBatched != 0 && m_bSendAnyway);)"語句前面加上"long iDone = 0;",再把"for (long iDone = 0;iDone < nSamples || (m_nBatched != 0 && m_bSendAnyway);)"改為"for (iDone = 0;iDone < nSamples || (m_nBatched != 0 && m_bSendAnyway);)"。
修改完錯誤再設置"生成"—>"批處理"。把Debug、Debug Unicode、Release、Relese Unicode這4個都勾起來。
單擊"重新生成"。
這樣strmbasd.lib就編譯好了。
? ?
? ?
三、 添加VS2008的頭文件目錄和靜態庫目錄。
1、 頭文件目錄。
要添加的目錄有:
D:\DXSDK\Include
D:\DXSDK\Samples\C++\DirectShow\BaseClasses
D:\DXSDK\Samples\C++\Common\Include。
2、 靜態庫目錄。
要添加的目錄有:
D:\DXSDK\Lib
D:\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug
D:\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug_Unicode
D:\DXSDK\Samples\C++\DirectShow\BaseClasses\Release
D:\DXSDK\Samples\C++\DirectShow\BaseClasses\Release_Unicode
?
DirectShow AMCap改裝, 無法解析的外部符號 "class CFactoryTemplate * g_Templates"
?
#ifdef?FILTER_DLL
/*?List?of?class?IDs?and?creator?functions?for?the?class?factory.?This
???provides?the?link?between?the?OLE?entry?point?in?the?DLL?and?an?object
???being?created.?The?class?factory?will?call?the?static?CreateInstance
???function?when?it?is?asked?to?create?a?CLSID_SystemClock?object?*/
CFactoryTemplate?g_Templates[1]?=?{
????//{&CLSID_SystemClock,?CSystemClock::CreateInstance}
{?L"SystemClock",?&CLSID_SystemClock,?CSystemClock::CreateInstance}
};
int?g_cTemplates?=?sizeof(g_Templates)?/?sizeof(g_Templates[0]);
#endif
找到問題了,表面上看是STRMBASE.lib的問題,而STRMBASE.lib是編譯自BaseClasses。上面的代碼是關鍵,截取自BaseClasses項目的sysclock.cpp,FILTER_DLL沒有預定義,所以出現問題,添加預定義就好了
VS2008下安裝與配置DirectShow SDK 9.0 及 DirectShow AMCap改裝的問題