编译directshow的示例程序baseclasses

来源:互联网 发布:如何评价胡的政绩 知乎 编辑:程序博客网 时间:2024/05/16 06:47

编译directshow的示例程序baseclasses

2009-04-20 09:32 860人阅读 评论(2) 收藏 举报

编译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文件的修改全部撤消),如图:

iid的设置界面

图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,然后再编译,终于通过!
原创粉丝点击