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

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

二、准备需要的静态链接库。

需要的静态链接库有strmiids.lib、strmbasd.lib、strmbase.lib、quartz.lib、winmm.lib。

其中strmiids.lib、quartz.lib在D:\ DXSDK\Lib文件夹下就有。strmbasd.lib要自己编译。

进入D:\ DXSDK\Samples\C++\DirectShow\BaseClasses文件夹下,双击baseclasses.sln。

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

按F7开始编译。

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

修改一些编译错误:

、 error C2146: 语法错误 : 缺少";"(在标识符"PVOID64"的前面)。

修改:在"typedef void * POINTER_64 PVOID64;"前面加上"#define POINTER_64 __ptr64"。

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

、 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int。

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

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

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

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

、error 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++) "。

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

、 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);)"。

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

个都勾起来。

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

单击"重新生成"。

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

这样strmbasd.lib就编译好了。

三、添加VS2008的头文件目录和静态库目录。

、头文件目录。

要添加的目录有:

D:\DXSDK\Include

D:\DXSDK\Samples\C++\DirectShow\BaseClasses

D:\DXSDK\Samples\C++\Common\Include。

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

、静态库目录。

要添加的目录有:

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

VS2008下安装与配置DirectShow SDK 9.0 及 DirectShow AMCap改装的问题

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没有预定义,所以出现问题,添加预定义就好了

上一篇:安装Elasticsearch中Head插件并使用


下一篇:“Unable to open kernel device \\.\Global\vmx86