Win Mobile 6.0+vs2005+directshow下pushsource filter的改写,谁能看一下为什么错了?拜托!(分不够再加)
错误1error LNK2019: 无法解析的外部符号 "public: __cdecl CSourceStream::CSourceStream(wchar_t *,long *,class CSource *,wchar_t const *)" (??0CSourceStream@@QAA@PA_WPAJPAVCSource@@PB_W@Z),该符号在函数 "public: __cdecl CPushPinDesktop::CPushPinDesktop(long *,class CSource *)" (??0CPushPinDesktop@@QAA@PAJPAVCSource@@@Z) 中被引用ZDesktopFilter.obj
错误2error LNK2001: 无法解析的外部符号 "protected: virtual long __cdecl CSourceStream::QueryId(wchar_t * *)" (?QueryId@CSourceStream@@MAAJPAPA_W@Z)ZDesktopFilter.obj
错误3error LNK2019: 无法解析的外部符号 "void __cdecl DbgLogInfo(unsigned long,unsigned long,wchar_t const *,...)" (?DbgLogInfo@@YAXKKPB_WZZ),该符号在函数 "public: virtual __cdecl CPushPinDesktop::~CPushPinDesktop(void)" (??1CPushPinDesktop@@UAA@XZ) 中被引用ZDesktopFilter.obj
错误4error LNK2001: 无法解析的外部符号 dpCurSettingsZDesktopFilter.obj
错误5error LNK2019: 无法解析的外部符号 "public: __cdecl CSource::CSource(wchar_t *,struct IUnknown *,struct _GUID)" (??0CSource@@QAA@PA_WPAUIUnknown@@U_GUID@@@Z),该符号在函数 "private: __cdecl CPushSourceDesktop::CPushSourceDesktop(struct IUnknown *,long *)" (??0CPushSourceDesktop@@AAA@PAUIUnknown@@PAJ@Z) 中被引用ZDesktopFilter.obj
错误6error LNK2001: 无法解析的外部符号 "public: virtual unsigned long __cdecl CBaseFilter::NonDelegatingRelease(void)" (?NonDelegatingRelease@CBaseFilter@@UAAKXZ)ZDesktopFilter.obj
错误7error LNK2001: 无法解析的外部符号 "public: virtual long __cdecl CSource::FindPin(wchar_t const *,struct IPin * *)" (?FindPin@CSource@@UAAJPB_WPAPAUIPin@@@Z)ZDesktopFilter.obj
错误8error LNK2001: 无法解析的外部符号 "public: virtual long __cdecl CBaseFilter::JoinFilterGraph(struct IFilterGraph *,wchar_t const *)" (?JoinFilterGraph@CBaseFilter@@UAAJPAUIFilterGraph@@PB_W@Z)ZDesktopFilter.obj
错误9error LNK2001: 无法解析的外部符号 "public: virtual long __cdecl CBaseFilter::QueryVendorInfo(wchar_t * *)" (?QueryVendorInfo@CBaseFilter@@UAAJPAPA_W@Z)ZDesktopFilter.obj
错误10fatal error LNK1120: 9 个无法解析的外部命令Windows Mobile 6 Professional SDK
[解决办法]
编译baseclass,生成lib,设置好lib库
[解决办法]
vc2005配置DirectShow整理如下
首先,就是编译baseclasses,什么是baseclasses?打开你的dx的sdk安装目录,例如:
D:\DX90SDK\Samples\C++\DirectShow\
这里就有一个叫baseclasses的工程,为安全起见,请先备份此工程。
1,双击baseclasses.sln打开,提示我们需要转换工程,按提示转换就是了,编译
提示错误:
1>D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(222) : error C2146: syntax error : missing ';' before identifier 'PVOID64'
1>D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(222) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(5940) : error C2146: syntax error : missing ';' before identifier 'Buffer'
1>D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>D:\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\DX90SDK\Samples\C++\DirectShow\BaseClasses\ctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
第一类问题的解决:错误发生在:operator=(LONG);函数定义中,这是因为在VC6中,如果没有显示的指定返回值类型,编译器将其视为默认整 形;但是vs2005不支持默认整形,解决这个问题不能修改每个没有显示指示返回值类型的函数地方,可以用wd4430来解决;具体的在工程选项中的c+ +/Command Line中添加/wd4430即可。
2,在Tools->Options->Projects and solutions->vc++ directories->show directories for里选择include files
然后增加
D:\DX90SDK\Include
D:\DX90SDK\Samples\C++\DirectShow\BaseClasses
D:\DX90SDK\Samples\C++\Common
可能会问题依旧,调整一下include files的顺序吧,把他们都放在最后,例如我的环境:
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(VCInstallDir)PlatformSDK\include
$(FrameworkSDKDir)include
D:\DX90SDK\Include
D:\DX90SDK\Samples\C++\DirectShow\BaseClasses
D:\DX90SDK\Samples\C++\Common
然 后在project->BaseClasses properties->configuration->C/C++ -> General->Additional Include Directories里面的内容(.,..\..\..\..\include)删掉,重新编译,PVOID64的错误消失,原因如下:
POINTER_64 是一个宏,在64位编译下起作用,它包含在SDK目录下的BASETSD.H中(Microsoft Visual Studio 8\VC\PlatformSDK\Include\basetsd.h(23):#define POINTER_64 __ptr64),但DXSDK自己也带了一个basetsd.h,里面没有定义POINTER_64,从而导致出错,只需要改变include files的优先级即可。当然,也可以改写winnt.h中的代码,在下面这两行:typedef void *PVOID;
typedef void *POINTER_64 PVOID64;
之前增加一行:
#define POINTER_64 __ptr64
3,到目前为止,还剩下:
BaseClasses\ctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
这个错误,解决方法如下:
打开project->BaseClasses properties->configuration->C/C++ ->Command Line,增加/wd4430选项。
4, 接着编译,提示error C2065: 'Count' : undeclared identifier等等错误,这个是微软的历史遗留问题了,C++标准语法的问题,因为在之前在for循环内定义的变量可以在for之外的地方使用,即 在第一个for里for(int i,...),以后的for再使用i不必再声明,解决方法也很简单,打开project->BaseClasses properties->configuration->C/C++->Language->Force Comformance in For Loop Scrope设置为No即可。当然,也可以手动改代码,增加一个声明就是了。
经过上面几个步骤,应该是可以顺利编译了,对于其它版本的工程,照样设置就可以了,总共编译出下面4个文件备用:
BaseClasses\Debug\strmbasd.lib
BaseClasses\Debug_Unicode\strmbasd.lib
BaseClasses\Release\STRMBASE.lib
BaseClasses\Release_UnicodeSTRMBASE.lib
在lib里面加入
commctrl.lib
coredll.lib
strmiids.lib (主要是这个库要放到工程下面去)
strmbase.lib
uuid.lib
ole32.lib
commdlg.lib
你或许需要在Tools->Options->Projects and solutions->vc++ directories->show directories for->library files里把它们加进去。
赶快编译DX90SDK\Samples\C++\DirectShow\Players\PlayDMO工程试试看吧。
DX90SDK为作者安装的DX版本
[解决办法]
看错误都是和wchar有关,应该是baseclass的编绎没有用unicode方式,mobile只支持unicode方式,改过来看看