[转载请注明原始出处:
http://write.blog.csdn.net/postedit/8704102]
最近有些流媒体相关的项目,突击了一下陆其明的两部大作,并推荐原MS DShow架构师Geraint Davies所在网址:http://www.gdcl.co.uk
通过google及自己的摸索,发现在vc8.0及更高版本下编译DShow应用、SDK工程或者开发Filter通常会遇到以下问题:
1.操作系统(WINVER或_WIN32_WINNT)版本冲突问题
该问题通常可以通过修改操作系统版本号来修正,例如在预编译头stdafx.h中开始的地方使用如下形式的定义来排除冲突
#ifndef WINVER #define WINVER 0x0501 #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif
2.运行时库的冲突
一般DSHOW应用或Filter控件开发均使用MD/MT/-d运行时库,若不愿意(~像我一样比较懒)安装DX SDK或类似Windows Server 2003 R2 Platform SDK(5.2.3790.2075.51)的朋友可能会遇到,如在MD/-d是可以考虑禁用MT/-d运行时库来解决冲突。参考代码如下:
#ifdef _DEBUG # pragma comment(linker, "/NODEFAULTLIB:libcmtd.lib") #else # pragma comment(linker, "/NODEFAULTLIB:libcmt.lib") #endif // !#ifdef _DEBUG
3. 若出现类似“C:\Program Files\Microsoft SDKs\Windows\v6.0A\\include\winnt.h(236) : error C2146: 语法错误 : 缺少“;”(在标识符“PVOID64”的前面)”不能识别PVOID64的问题,通常是应用于不同Windows SDK版本的头包含造成的宏冲突的问题,解决办法如下:
自定义一个 "my_def.h"头文件,内容如下:
#pragma once #ifndef POINTER_64 #if !defined(_MAC) && (defined(_M_MRX000) || defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_VER >= 1100) && !(defined(MIDL_PASS) || defined(RC_INVOKED)) #define POINTER_64 __ptr64 typedef unsigned __int64 POINTER_64_INT; #if defined(_WIN64) #define POINTER_32 __ptr32 #else #define POINTER_32 #endif #else #if defined(_MAC) && defined(_MAC_INT_64) #define POINTER_64 __ptr64 typedef unsigned __int64 POINTER_64_INT; #else #if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED)) #define POINTER_64 __ptr64 #else #define POINTER_64 #endif typedef unsigned long POINTER_64_INT; #endif #define POINTER_32 #endif #endif // #ifndef POINTER_64该文件应用于使用预编译头或不使用预编译头的各种情况,只需要INCLUDE进来就OK了。
4.出现其他各类链接错误,有种比较能根治的措施 -- 重新编译SDK的BaseClasses工程。当然这样做还有更多的好处,最重要的一点是可以Review代码时,能调试跟踪。
[这里]提供了一份不用下载SDK或DX,而能编译并调试跟踪的工程源代码(包含生成STRMBASE.lib/strmbasd.lib的BaseClasses工程),使用到了陆其明提供的AVChat的开源代码(非常感谢这位老兄的无私奉献)做为示范,您只需要简单地右键”生成解决方案“就好了,希望对需要的朋友有些帮助。