今天用VS2005编译DirectShow程序,一些莫名其妙的问题总结
来源:互联网 发布:电脑桌面怎么下载淘宝 编辑:程序博客网 时间:2024/05/18 01:08
error LNK2001: 无法解析的外部符号 "public: virtual long __stdcall CBaseFilter::FindPin(wchar_t const *,struct IPin * *)" (?FindPin@CBaseFilter@@UAGJPB_WPAPAUIPin@@@Z)
error LNK2001: 无法解析的外部符号 "public: virtual long __stdcall CBaseFilter::JoinFilterGraph(struct IFilterGraph *,wchar_t const *)" (?JoinFilterGraph@CBaseFilter@@UAGJPAUIFilterGraph@@PB_W@Z)
error LNK2001: 无法解析的外部符号 "public: virtual long __stdcall CBaseFilter::QueryVendorInfo(wchar_t * *)" (?QueryVendorInfo@CBaseFilter@@UAGJPAPA_W@Z)
上网一查,发现如下设置即可:
C/C++ | Language | Treat wchar_t as built-in type: yes?no?
默认为是,设置为否即可
(1) 为什么会出现这种错误呢?是因为VC6以及VS2003在wchar_t内置的选项上默认为No,而VS2005在此选项上默认为Yes,我今天使用VS2005打开原来VS2003建立的BaseClass项目,使得选项为No,这样编译出来的基类库的选项就是No了。
然后,在使用VS2005新建DirectShow程序时,默认选项为Yes,这样程序与基类的选项就不一致了,在函数的参数涉及到wchar_t时,程序的链接会由于生成的名字不同而导致链接不上(同样是wchar_t,链接时lib文件的符号是不同的)。
弄清楚这个问题之后,此选项的选择就无所谓了,只要工程和Lib在该选项上一致即可
(2)
通过查看定义CBasefilter类的头文件(amfilter.h)我发现其中关于构造函数的定义有如下代码
C/C++ code public: CBaseFilter( const TCHAR *pName, // Object description LPUNKNOWN pUnk, // IUnknown of delegating object CCritSec *pLock, // Object who maintains lock REFCLSID clsid); // The clsid to be used to serialize this filter CBaseFilter( TCHAR *pName, // Object description LPUNKNOWN pUnk, // IUnknown of delegating object CCritSec *pLock, // Object who maintains lock REFCLSID clsid, // The clsid to be used to serialize this filter HRESULT *phr); // General OLE return code #ifdef UNICODE CBaseFilter( const CHAR *pName, // Object description LPUNKNOWN pUnk, // IUnknown of delegating object CCritSec *pLock, // Object who maintains lock REFCLSID clsid); // The clsid to be used to serialize this filter CBaseFilter( CHAR *pName, // Object description LPUNKNOWN pUnk, // IUnknown of delegating object CCritSec *pLock, // Object who maintains lock REFCLSID clsid, // The clsid to be used to serialize this filter HRESULT *phr); // General OLE return code #endif
所以我想,vs默认编码就是unicode的,所以应该用的构造函数时下面两个,于是我把调用CBasefilter构造函数的地方改成
C/C++ code CBaseFilter("NetSender", lpunk, &mFilterLock, CLSID_NetSender)
原来是
C/C++ code CBaseFilter(NAME("NetSender"), lpunk, &mFilterLock, CLSID_NetSender)
其他的构造函数的调用也进行相应的改造,果然将这些link error都给kill掉了^_^
但是还有一处有问题就是关于CPosPassThru这个构造函数,这个类的构造函数没有定义unicode版本的,只有这样一个构造函数
C/C++ code CPosPassThru(const TCHAR *, LPUNKNOWN, HRESULT*, IPin *);
我去掉NAME宏以后出现如下错误
C/C++ code error C2664: 'CPosPassThru::CPosPassThru(const TCHAR *,LPUNKNOWN,HRESULT *,IPin *)' : cannot convert parameter 1 from 'const char [13]' to 'const TCHAR *'
我使用NAME宏的话,又出现连接错误
C/C++ code error LNK2028: unresolved token (0A00024D) "public: __thiscall CPosPassThru::CPosPassThru(unsigned short const *,struct IUnknown *,long *,struct IPin *)" (??0CPosPassThru@@$$FQAE@PBGPAUIUnknown@@PAJPAUIPin@@@Z)
也就是说,它认为我给它传入的第一个参数是一个unsigned short const char*类型
1,请问为什么我使用NAME宏,它会认为我使用的是unsigned short const char*类型,NAME宏不就是TEXT宏么,而TEXT宏不就是可以将常量字符创转换成TCHAR*么?
2,如何解决这个问题,我想也就是如何将unsigned short const char*转换成TCHAR*的问题。
- 今天用VS2005编译DirectShow程序,一些莫名其妙的问题总结
- VS2005编译DirectShow的问题与解决
- C++ 程序编译的一些莫名其妙的错误。【2013.11.7】
- DirectShow在VS2005中编译问题汇总
- VS2005 directshow 编译开发环境的配置
- VS2005下编译directshow错误的解决方法
- 编译时一些莫名其妙的错误
- 今天写程序遇到的一些问题
- VS2010编译的时候碰到winnt.h问题 ,DirectShow 在VS2005中环境配置
- DirectShow 在vs2005中的问题解决之基类编译问题
- 程序莫名其妙问题
- VS2005向导生成的win32程序编译GDI+问题
- 一些莫名其妙的错误
- 莫名其妙的编译出错
- DirectShow 在VS2005/VS2010中环境配置和编译运行出现 winnt.h(5940)错误问题的解决
- 编译directshow的示例程序baseclasses
- 编译directshow的示例程序baseclasses
- Directx SDK9.0b 中的程序在VS2005中编译中的一些问题
- 开博了
- 如何清空结构体?
- Jcseg分词 介绍
- linux定时任务二
- struts2中使用ModelDriven
- 今天用VS2005编译DirectShow程序,一些莫名其妙的问题总结
- 程序设计作业上机实践项目二
- Unity3D自带地形系统的创建与简单设置图文详解
- Java中String.split()用法
- 堆和栈的区别
- MySQL数据库查询变慢的分析及解决过程
- network_flow(zhuan)
- ubuntu 添加分辨率
- 《BOSS蜜令,老公结婚吧!》