VC6工程升级VS2013汇总

问题1:Building an MFC project for a non-Unicode…

Building an MFC project for a non-Unicode character set is deprecated

解决方法

用于多字节字符编码 (MBCS) 的 MFC 库 (DLL) 不再包含于 Visual Studio 中,但是可用作插件,您可以在任何装有 Visual Studio Professional、Visual Studio Premium 或 Visual Studio Ultimate 的计算机上下载和安装。(在 Visual Studio 中,必须启用 MFC。)安装需要大约 440 MB 磁盘空间,包括英语(美国)和 DLL 的本地化版本。

在安装 MBCS DLL 后,如果卸载或修复 Visual Studio,则还会卸载或修复。 但是,如果只禁用 MFC,MBCS DLL 仍会保留在系统上。 如果仅卸载或修复 MBCS DLL,将不会修改 Visual Studio。

总结下就是安装   Multibyte MFC Library for Visual Studio 2013

详细信息:http://blogs.msdn.com/b/vcblog/archive/2013/07/08/mfc-support-for-mbcs-deprecated-in-visual-studio-2013.aspx            

下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=40770

 

问题2:warning C4996: 'MBCS…

warning C4996: 'MBCS_Support_Deprecated_In_MFC': MBCS support in MFC is deprecated and may be removed in a future version of MFC.

解决方法

这个链接http://go.microsoft.com/fwlink/p/?LinkId=279048文中提到可以通过将 NO_WARN_MBCS_MFC_DEPRECATION 预处理器定义添加到您的项目生成定义消除此警告。在项目stdafx.h文件中的#pragma once下面添加

#define NO_WARN_MBCS_MFC_DEPRECATION

#define NO_WARN_MBCS_MFC_DEPRECATION  

 

问题3:warning C4996应该加“_s”安全Security CRT functions 

原因是Visual C++ 2005使用了更加安全的run-time library routines,新的Security CRT functions(就是那些带有“_s”后缀的函数):

解决办法:在预编译头文件stdafx.h里(同样要在没有include任何头文件之前)定义下面的宏:
  #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

  #define _CRT_SECURE_NO_DEPRECATE
  在链接的时候便会自动将旧函数替换成Security CRT functions同时去掉红色警告。

 

 

问题4:error C1189: #error : MFC does not support WINVER…

error C1189: #error : MFC does not support WINVER less than 0x0501. Please change the definition of WINVER in your project properties or precompiled header.  

解决方法

将stdafx.h文件中的

[cpp] view plaincopyprint?

 

  1. #define WINVER 0x0400      
  2. #define WINVER 0x0501       
  3. #define _WIN32_WINNT 0x0400    
  4. 改为  
  5. #define _WIN32_WINNT 0x0501   

 

#define WINVER 0x0400    

#define WINVER 0x0501     

#define _WIN32_WINNT 0x0400  

改为

#define _WIN32_WINNT 0x0501

 

问题5:_WIN32_WINNT not defined….

_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)

解决方法

在StdAfx.h头文件里面加上#include <SDKDDKVer.h>有关于平台的定义

 

 

问题6:warning C4996: 'CWinApp::Enable3dControlsStatic':

warning C4996: 'CWinApp::Enable3dControlsStatic': CWinApp::Enable3dControlsStatic is no longer needed. You should remove this call.

解决方法

直接注释掉 代码如下

[cpp] view plaincopyprint?

  1. #ifdef _AFXDLL  
  2.     Enable3dControls();         // Call this when using MFC in a shared DLL  
  3. #else  
  4.     //Enable3dControlsStatic(); // Call this when linking to MFC statically  
  5. #endif  

 

#ifdef _AFXDLL

Enable3dControls(); // Call this when using MFC in a shared DLL

#else

//Enable3dControlsStatic(); // Call this when linking to MFC statically

#endif

 

问题7:error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)...

不能转换void (_thiscall CMainFrame::*)(void)to LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)2014-07-13 11:35开发平台由VC6.0升级至VS2010,需要将原有的项目迁移,可能碰到类似错误:
error C2440: 'static_cast' : cannot convert from 'void (__thiscall CMainFrame::* )(void)' to 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'

VS2010对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2010下编译不通过

ON_MESSAGE(WM_message,OnMyMessage);
OnMyMessage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);如果不符合,则有错误提示:
error C2440: “static_cast”: 无法从“void (__thiscall CPppView::* )(WPARAM,LPARAM)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”
在匹配目标类型的范围内没有具有该名称的函数
error C2440: “static_cast”: 无法从“void (__thiscall CPppView::* )(void)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”
在匹配目标类型的范围内没有具有该名称的函数

解决方法如下:
首先,把原来的消息函数返回值类型改为LRESULT,函数内可以随便写个return TRUE; 然后消息函数的参数必须改写成(WPARAM wParam,LPARAM lParam)而不论这两个参数是否用得到;最后,消息映射如ON_MESSAGE(WM_message,& OnMyMessage)

 

 

 

问题8:编译链接时提示找不到预编译头

通常,直接向工程文件里加入一个.cpp 源文件后,编译链接时总是提示找不到预编译头,此时就需要在源文件头部添加如下的包含语句:

#include "stdafx.h" 说明  在添加stdafx.h包含语句后,最好也加上应用头文件的包含语句。 

 

 

 

问题9:不能通过双击成员变量或成员函数转移至变量或函数定义的位置

在实际开发中,也常常遇到如下的情况。向类中添加的成员变量或成员函数不能在ClassView中显示。不能通过双击成员变量或成员函数转移至变量或函数定义的位置。一般情况下,在输入一个类的对象后,按下“.”后将会出现该类的成员变量和成员函数;或者当输入一个类对象或结构的指针时,按下“>”后也将会出现该类的成员变量和成员函数。这也是Visual C++编译器所固有的功能,可是会发现这两种功能经常不能使用。当出现上述几种情况时,首先关闭工程,然后删除工程文件夹下的.ncb 文件,最后打开工程重新编译即可恢复原有的功能。

 

 

 

问题10.在vc6.0中如何干净的删除类

通常,需要从工程中删除一个不再使用的类,删除类的方法很有讲究,如果不能彻底地删除,将会产生莫名其妙的错误。一般可以按照如下的方法进行。首先在工作区的FileView中选中该类的.h 和.cpp 文件,按Delete键删除,然后在工程的文件夹下将这两个文件删掉,并且把.clw文件也删除(如果不删除此文件,也可以再次运行ClassWizard,这时出现“是否移走该类”的提示,选择remove也可以)即可。在删除.clw文件文件之后,再次使用类向导时将会弹出“.clw 文件不存在”的提示,这时可以按照弹出的提示从工程中的文件创建一个.clw文件文件即可。另外,还需要把引用该类头文件的包含语句删除,否则也将出现错误。

 

 

 

问题11:类的消失

实践中,经常会发现在对某个类作出一系列的操作(如添加成员、响应消息等)后该类竟然从ClassView中消失了,可是并没有任何与该类相关的文件删除操作。其实这是Visual C++的一个bug。遇到这种情况时,一般只需要打开该类对应的头文件,将其类名改一下,然后再恢复这个类的类名称即可,或者在定义类的“class”以及继承类型的关键字之间,随意敲上一个空格或者删除一个空格,也可以达到同样的效果。

 

 

问题12 error C2065: “i”: 未声明的标识符

 解决办法,将 for (int i = 0; i < m_deviceList.size(); i++) { m_ctlDevicelist.AddString(m_deviceList[i]); } 中变量 i 的定义放到函数体开头 int i; for (i = 0; i < m_deviceList.size(); i++) { m_ctlDevicelist.AddString(m_deviceList[i]); }

另一种方法:

在VC6中,for(int i=0;i<=10;i++) 这里定义的 i 相当于在for外定义的,作用域不只是for的{}内。但是,VS2010支持C++标准,i只能在for的 {}内使用。解决这个问题,可以右键单击项目名,选择 属性,然后依次选择 配置属性、C/C++、语言,在“强制for循环的一致性”后的下拉框将“是”修改为“否”

 

问题13: error LNK2019: 无法解析的外部符号 __imp___vsnprintf,

该符号 在函数 _StringVPrintfWorkerA@20 中被引用 odbccp32.lib 是在程序中对数据库操作时用到的,这个链接问题在使用静态 DLL 方式时才会遇 到,如果使用共享 DLL 方式时不会出现,但是因为本程序需要使用静态 DLL 方式,所以继续尝 试其他的解决方法。尝试在程序属性的连接器输入选项中添加附加依赖项 odbccp32.lib,依然 报错。于是在系统中搜索这个 lib 文件,最终找到了两种不同版本的 odbccp32.lib。 VC6.0 中文件信息: C:¥Program Files¥Microsoft Visual Studio¥ VC98¥ Lib¥ODBCCP32.LIB

VS2010 中文件信息: C:¥Program Files¥Microsoft SDKs¥ Windows¥v7.0A¥Lib¥odbccp32.lib

从文件信息中可以看出两个文件的版本大小都不同。在程序属性的连接器输入选项中添加附 加依赖项 C:¥ Program Files¥Microsoft Visual Studio¥VC98¥Lib¥ODBCCP32.LIB,使用 VC6.0 版本的 odbccp32.lib,编译连接成功。但是添加 C:¥ Program Files¥Microsoft SDKs¥ Windows¥v7.0A¥Lib¥odbccp32.lib,使用 VS2010 版本错误依旧会出现。 从上面可以看出这个链接问题是 VC6.0 和 VS2010 中 odbccp32.lib 版本不同造成的,解决办 法便是在程序属性的连接器输入选项中添加附加依赖项 C:¥ Program Files¥Microsoft Visual Studio¥ VC98¥Lib¥ODBCCP32.LIB,使用 VC6.0 版本的 odbccp32.lib。

 

 

问题14 error C2664: “void ATL::CStringT::Format(const unsigned short *,...)”: 

不能将参数 1 从“const char [3]”转换为“const unsigned short *” 1> 1> 1> 1> 1> ] with [ BaseType=wchar_t, StringTraits=StrTraitMFC

与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换 这个问题在 VC6 程序升级到 VS2010 时都会遇到,原因就是编码模式的不同。在 VC6 中,默认 使用 MBCS(Multi-Byte Character Set)编码,即多字节字符;而 VC8、VC7 默认的是 Unicode 编码。所以解决办法便是程序属性常规选项的字符集改为“Use Multi-Byte Character Set”即可。 字符基础(ASCII,DBCS,Unicode) 所有的 string 类都是以 C-style 字符串为基础的。C-style 字符串是字符数组。所以我们先介绍 字符类型。这里有 3 种编码模式对应 3 种字

 

问题15、VS2010不支持默认整形

在VC6中,如果没有显式地指定运算符重载函数的返回值类型,编译器默认返回整形。但VS2010不支持默认整形。 解决这个问题,可以右键单击项目名,选择 属性,然后依次选择 配置属性、C/C++ 、命令行,在附加选项中添加  /wd4430 即可

 

问题16error C3861: 'min': identifier not found

周末调试mfc程序, 因为程序中要调用opencv的库。 

但是出现了:microsoft sdks\windows\v6.0a\include\gdiplustypes.h(658) : error C3861: 'min': identifier not found

这么一个问题。  在网上查呢,他们的解释都是关于,他们建的工程不是mfc程序, 是调用了CMake。

如:websit。 但是呢,我这建立的就是mfc程序。 加了NOMAXMIN都没有用。 

后面找到问题的根本原因了:原因是因为我包含的第三方库的OpenCV的头文件和系统头文件相冲突。 

这就涉及到了C++中头文件的包含顺序问题。 然后我把第三方库的头文件放到最后, 并且是引号"" 去包括头文件。 

[cpp] view plaincopyprint?

  1. #include <atlimage.h>  
  2. #include "opencv2/opencv.hpp"  

#include <atlimage.h>

#include "opencv2/opencv.hpp"

再去编译就编译成功了。 

问题17:LNK4075: ignoring '/EDITANDCONTINUE'….

LNK4075: ignoring '/EDITANDCONTINUE' due to '/SAFESEH' specification

解决方法

 

_CRT_SECURE_NO_DEPRECATE

_SCL_SECURE_NO_DEPRECATE

_WINSOCK_DEPRECATED_NO_WARNINGS

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值