1. 程式人生 > >VS2008下安裝與配置DirectShow SDK 9.0 及 DirectShow AMCap改裝的問題

VS2008下安裝與配置DirectShow SDK 9.0 及 DirectShow AMCap改裝的問題

靜態庫 cfa -c class 文件目錄 call ref stat and

一、 安裝DirectShow

我裝的是DirectShow SDK 9.0b。安裝程序名為DXSDK_Jun10.exe

下載地址:https://pan.baidu.com/s/1kURma3t

下載地址:https://pan.baidu.com/s/1slfmSMD

技術分享

技術分享

技術分享

技術分享

技術分享

? ?

? ?

二、 準備需要的靜態鏈接庫。

需要的靜態鏈接庫有strmiids.libstrmbasd.libstrmbase.libquartz.libwinmm.lib

其中strmiids.libquartz.lib

D:\ DXSDK\Lib文件夾下就有。strmbasd.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:

缺少類型說明符 - 假定為 int。註意: C++ 不支持默認 int

修改:把"operator=(LONG);"改成"LONG operator=(LONG);"

技術分享

修改:把"static g_dwLastRefresh = 0;"改成"static DWORD g_dwLastRefresh = 0;"

技術分享

3error C2065: "Count": 未聲明的標識符。

修改:在"for (UINT Count = 0;Count < Result;Count++) "語句前面加上"UINT Count = 0",再把"for (UINT Count = 0;Count < Result;Count++) "

改為"for (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);)"

技術分享

修改完錯誤再設置"生成"—>"批處理"。把DebugDebug UnicodeReleaseRelese Unicode4個都勾起來。

技術分享

單擊"重新生成"

技術分享

這樣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.cppFILTER_DLL沒有預定義,所以出現問題,添加預定義就好了

VS2008下安裝與配置DirectShow SDK 9.0 及 DirectShow AMCap改裝的問題