用VC6.0 改写ANSI工程到UNICODE工程全过程

 

最近,接到一个任务要将一个软件改写为支持中方版本的。其实思路很简单,只要将工程文件从ANSI版本改为UNICODE版就可以了。不过在改写的过程中还是遇到一些个小问题,现把整个过程记录下来,以便以后再遇到方便,同时,如果其它朋友也遇到同样的问题,也好解决,不用再一个个的找原因了。

 

1.首先,打开工程->重新编译。

        确保原工程编译通过。

2.然后依次打开 project->setting ->c/c++ ->preprocessor definitions 下添加 _UNICODE

 

再编译,试试,看出现什么问题:)

    编译到下面这行时出现:error C2002: invalid wide-character constant

  1. AddSpecChar(_T("•"), _T("/x95/0"));

    解决方法:将_T("/x95/0")改为_T("/0x95")

3.再重新编译

    出现error LNK2001: unresolved external symbol _WinMain@16的问题

    解决方法:引用“风影海翼”的博客中的解决方案 http://blog.chinaunix.net/u1/54017/showart_489195.html提到的第三个解决方案。

解决外部符号错误:_main,_WinMain@16,__beginthreadex
在创建MFC项目时, 不使用MFC AppWizard向导,  就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有: libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex p
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

1. Windows子系统设置错误, 提示:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:

[Project] --> [Settings] --> 选择"Link"属性页, 
在Project Options中将/subsystem:console改成/subsystem:windows 

2. Console子系统设置错误, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
控制台项目要使用Console子系统, 而不是Windows, 设置:

[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:windows改成/subsystem:console

3. 程序入口设置错误, 提示:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:

[Project] --> [Settings] --> 选择"Link"属性页, 在Category中选择Output, 再在Entry-point symbol中填入wWinMainCRTStartup, 即可 
4. 线程运行时库设置错误, 提示:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

这是因为MFC要使用多线程时库, 需要更改设置:

[Project] --> [Settings] --> 选择"C/C++"属性页, 在Category中选择Code Generation,再在Use run-time library中选择Debug Multithreaded或者multithreaded 其中,
Single-Threaded                单线程静态链接库(release版本) ,
Multithreaded                  多线程静态链接库(release版本) "
multithreaded DLL              多线程动态链接库(release版本)
Debug Single-Threaded          单线程静态链接库(debug版本)
Debug Multithreaded            多线程静态链接库(debug版本)
Debug Multithreaded DLL        多线程动态链接库(debug版本)
单线程: 不需要多线程调用时, 多用在DOS环境下 
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用 -
debug版本: 调试阶段使用  

 

4.再编译,出现:

    warning C4706: assignment within conditional expression的警告。

    解决方法:设置project->setting ->c/c++ warning level改为level 3

    

 

5.再编译出现 fatal error LNK1104: cannot open file "mfc42ud.lib" 错误,可以下载相应的lib和dll文件。

我已经打包在http://download.csdn.net/source/844677可以下载到,包括最后调试时要用到的UAFXCWD.PDB文件

http://www.fdigg.net/sitelist.aspx?id=8A5A0A700A7500BF&dir=0030190722470F1621A2F99303BBFEBB可以下到整个vc6.0的文件

 

6.最后编译,谢天谢地 - 0 error(s), 0 warning(s) 大功告成!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值