星期四, 五月 14, 2009

时隔一年,编写DirectShow Filter时遇到的一些新旧问题的记录

掐指算来,上一次研究DirectShow Filter已经是一年前的事情了。技术这东西,一旦长时间不用,就会立刻生疏起来。因为一个小项目,最近又要重新拾起它来。本以为项目不是很困难,可是真正做起来,却发现遇到了好些个问题,这次记录下来,以备以后查看。

1、版本问题
上次开发主要使用了Visual C++ 6.0。时代变迁,电脑升级,这回改用Visual Studio 2005来生成工程。一开始打算使用Visual Studio 2005自带的DirectShow来做,不再安装其他的SDK。但发现VS2005并不带有编写DirectShow Filter所需要使用的BaseClasses例程,所以还是安装了Platform SDK for Windows Server 2003 R2, 以及一个DirectX SDK march 2009。

2、编译BaseClasses
分别在cmd下执行Microsoft Platform SDK for Windows Server 2003 R2\SetEnv.Cmd和Microsoft Visual Studio 8\VC\vcvarsall.bat设置运行环境变量,直接在BaseClasses下nmake

3、编译自己的Filter
上次刚开始研究编写Filter的时候,链接BaseClasses生成的库也总是出现unresolved external symbol链接错误,让我研究了好久才搞明白。这一次又出现了这样的问题,只知道是哪里的编译参数有错,但找不到具体位置。本来以为是因为wchar_t是否是默认类型的影响,来回设置了好几次也没有效果。最后受搜索结果的启发,想起来可能是因为UNICODE的原因导致的。将自己的Filter工程设置为非UNICODE之后,编译通过。

4、GraphEdit的Connect to Remote Graph功能
无法使用,运行程序之后,无法在GraphEdit中得到程序的Graph。
百思不得其解,搜索得到结果是,新的支持Vista的SDK下使用的组件与旧系统不同,注册propage.dll(在Microsoft SDKs\6.0A\)之后,问题解决。

5、向Graph中增加自己的Filter失败
纯属个人对COM不完全理解所至,应该是个很低级的错误:在编写的.def文件中应该至少包含如下几项:
DllMain PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
一开始写的时候少了第二、三项,导致在CoCreateInstance的时候产生0x800401f9(Error in DLL)错误。

微软已经开始推广新的Media Foundation了,不知道DirectShow还能用几年:)
搞应用技术的,永远都要跟着标准厂商走,永远要学习……

还好我现在有一个走向低层开发的机会——当然一时还脱离不开Intel Architecture,不过Intel的变动性要比M$少得多了:D

没有评论: