Visual C++ 2010 Express下使用WTL
下载WTL和VCX2010之类就不再赘述了,假设已经VCX2010已经安装,WTL已经解压好,以下都以TabBrowser例子来说明。
因为WTL是基于ATL的,而免费的VCX2010并不包括ATL,所以第一个问题就是如何获取最新且合法的ATL代码,注意是“合法的”,类似这篇帖子里面的方法还是不要考虑了,至于用老旧的Platform SDK的方法,当然也不考虑,因为不是最新的,要同时满足上面两个条件,最好的方法就是去下载最新的WDK,在WDK里面包含了atl71,安装好就ok了。
编译例子会碰到提示
1. fatal error C1083: 无法打开包括文件:“atlbase.h”: No such file or directory
很好办,添加atl71的路径到附加包含目录就行了
2. error C2065: “_stdcallthunk”: 未声明的标识符
error C2070: “'unknown-type'”: 非法的 sizeof 操作数
因为新ATL库修改了_stdcallthunk的定义位置,所以要把atlstdthunk.h包含进来,像这样:
#include <atlbase.h>
#include <atlstdthunk.h>
3. fatal error C1083: 无法打开包括文件:“atlapp.h”: No such file or directory
没什么好说的,继续包含WTL的头文件进来。
4. fatal error RC1015: cannot open include file 'atlres.h'.
这个问题倒是头次遇到,连资源头文件也要包含进来,项目属性->资源->常规->附件包含目录。
最后再添加库文件的目录到附件库目录就OK了,32位系统当然是选\lib\ATL\i386,编译OK。
等等,还有这一堆警告怎么办?
1>------ 已启动生成: 项目: TabBrowser, 配置: Debug Win32 ------
1>atlsd.lib(atlcommodule.obj) : warning LNK4078: 找到多个“ATL”节,它们具有不同的特性(40301040)
1>stdafx.obj : warning LNK4254: 节“ATL”(50000040)合并到具有不同特性的“.rdata”(40000040)
1>TabBrowser.obj : warning LNK4254: 节“ATL”(50000040)合并到具有不同特性的“.rdata”(40000040)
1>atlsd.lib(externs.obj) : warning LNK4254: 节“ATL”(50000040)合并到具有不同特性的“.rdata”(40000040)
1>atlsd.lib(atldebugapi.obj) : warning LNK4254: 节“ATL”(50000040)合并到具有不同特性的“.rdata”(40000040)
1>atlsd.lib(atltrace.obj) : warning LNK4254: 节“ATL”(50000040)合并到具有不同特性的“.rdata”(40000040)
1>atlsd.lib(atlbase.obj) : warning LNK4254: 节“ATL”(50000040)合并到具有不同特性的“.rdata”(40000040)
1>atlsd.lib(atlcommodule.obj) : warning LNK4254: 节“ATL”(50000040)合并到具有不同特性的“.rdata”(40000040)
1>atlsd.lib(atlfuncs.obj) : warning LNK4254: 节“ATL”(50000040)合并到具有不同特性的“.rdata”(40000040)
1>atlsd.lib(stdafx.obj) : warning LNK4254: 节“ATL”(50000040)合并到具有不同特性的“.rdata”(40000040)
1>atlsd.lib(allocate.obj) : warning LNK4254: 节“ATL”(50000040)合并到具有不同特性的“.rdata”(40000040)
1>atlsd.lib(atltracemodulemanager.obj) : warning LNK4254: 节“ATL”(50000040)合并到具有不同特性的“.rdata”(40000040)
充耳不闻不是好态度,原因是因为VCX2010默认不使用ATL,把项目属性->常规->ATL的使用改掉就好,静态还是动态就看实际需要了。
好了,整个世界清净了,打完收工,谢谢观看。