您的位置:首页 > 其它

编译directshow的示例程序baseclasses

2009-04-20 09:32 483 查看
编译baseclasses

Ligo,
2009.4.17

由于此工程的头文件中包含文件时都用了<>符号,所以在进行以下所说的任何操作之前,必需首先设置好VS的包含路径,即把baseclasses的工程目录加到VS的包含路径中。这个工程需要这样的设置,不太好,它必竟是做为一个“demo”出现的,而且,对于不同的开发都来说,可能会放这个工程到不同的目录,所以这样设置就不好。所以我没有设置这个路径,而是修改工程的包含文件来解决这个问题,因为我的工程没有直接在它安装的默认目录中编译,而是被我拷贝到另外一个地方进行的编译。
注:我编译使用的是vs2008,os 是vista,baseclasses工程是从windows sdk的安装包中获取的(早期的directshow示例都是在directx的单独安装包中,现在新的都改成了从windows sdk的安装包中发布),我的工程中有combase.h文件,有的版本没有这个文件,我就不知道其编译是否可以非常顺利。
下载地址:
web:http://www.microsoft.com/downloads/details.aspx?FamilyId=F26B1AA4-741A-433A-9BE5-FA919850BDBF&displaylang=en
名称:name:Windows SDK for Windows Server 2008 and .NET Framework 3.5
文件名:6.0.6001.18000.367-KRMSDK_EN.iso
大小:1.29G
安装的默认路径为:c:/Program Files/Microsoft SDKs/Windows/v6.1

在默认情况下,是编译成为静态链接库的,这很简单,只要设置好包含的路径就可以直接编译,但是我要使用动态库,所以我直接修改编译选项为动态链接,然后把streams.h中包含本地文件的符号全部由<>改成了双引号"",然后编译时编译不过,说是_CLSID_MemoryAllocator无法链接(实际代码中是CLSID_MemoryAllocator,没有带前导下划线)
我发现是在uuids.h中有声明CLSID_MemoryAllocator,所以就在相关的文件中包含了uuids.h文件,再编译,还是不过,又说是MEDIASUBTYPE_None没有声明,晕!
上网上找,发现很多都是说的很简单,而且都是抄来抄出说得一样,好不容易才找到一个比较好的:http://blog.sina.com.cn/s/blog_4c0aa7ef0100cyqr.html,按照上面说的,把strmiids.lib 和 quartz.lib加入到编译选项中(上面说的包含uuids.h文件的修改全部撤消),如图:



图1
注意,有的baseclasses工程好像没有linker这个选项卡,我没有找它可以在哪里增加这两个lib,我想应该是有地方可以加的。再次编译,还是不过,又说 g_Templates 没有声明,无法链接通过。
从代码查找g_Templates,发现它是被一个宏定义FILTER_DLL包含,于是在链接选项中又加入了FILTER_DLL,如图:



图2
再编译,还是不过,这次只出现如下的两个错误:
1. baseclasses/sysclock.cpp(23) : error C2440: 'initializing' : cannot convert from 'const GUID *' to 'const WCHAR
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
2. baseclasses/sysclock.cpp(23) : error C2440: 'initializing' : cannot convert from 'CUnknown *(__stdcall *)(LPUNKNOWN,HRESULT *)' to 'const CLSID *'
1> There is no context in which this conversion is possible*'
第一个错误,查看CFactoryTemplate的类声明发现,前两个成员是:
const WCHAR * m_Name;
const CLSID * m_ClsID;
这和g_Templates在声明时的附值是不一样的,所以就调换了这两个成员的声明顺序:
const CLSID * m_ClsID;
const WCHAR * m_Name;
第二个错误,直接简单地在g_Templates声明时候的附值时使用强制转换(const WCHAR*)CSystemClock::CreateInstance。
这两个错误的解决过程,没有试验是否会造成不正确的后果。然后编译,还是不过,说是timeEndPeriod无法链接,查msdn,直接在图1所示位置添加winmm.lib,然后再编译,终于通过!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: