VC6.0转VS2005问题及解决办法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

该文主要内容转载自:http://www.cnblogs.com/sunliming/archive/2011/05/08/2040152.html。

我对原文的内容加以整理,便于阅读,以后发现新的转换问题,将会继续补充,

也欢迎大家跟帖提出新的问题并解决办法,帮助我继续完善,谢谢!


一.  函数原型改变导致的问题

1. errorC2440:CMainFrame 无法从 NMTOOLBARA转换为 NMHDR

    VC6下OnToolbarDropDown的函数原型:

  voidCMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr) 
   需要改为:

  void CMainFrame::OnToolbarDropDown(NMHDR*pnmhdr, LRESULT *plr)
  {
    LPNMTOOLBAR pnmtb =reinterpret_cast<LPNMTOOLBAR>(pnmhdr);     
    // ...
  }  

2. error C2668: 'sqrt' : ambiguouscall to overloaded function

    原因:在VS2005中存在sqrt函数的重载。当编译器看到sqrt(int)时,找不到相应的函数,此时存在sqrt(float)和sqrt(long double)两个函数,编译器不知道程序员需要哪个函数,就会出现错误。

    解决办法:可以使用sqrtf( )代替。

3. error C2039: 'ReadHuge' : is not a member of 'CFile'

    原因:VS2005中,readhuge被read包括了。

4. error C2668: 'pow' : ambiguouscall to overloaded function

    在VS2005中,需要写成pow((double)i, 2),原因我没有查到。

    在VS2005中,函数原型为 double__cdecl pow(__in double _X, __in double _Y);

    在VC6中,函数原型为_CRTIMP double __cdecl pow (double, double);

5.ON_WM_NCHITTEST (and other MFCmacros) won't compile in VS2005。

    VS2005中,ON_WM_NCHITTEST宏编译不过:

    error C2440: 'static_cast' : cannot convertfrom 'UINT (__thiscall CMenuBar::* )(CPoint)' to 'LRESULT (__thiscall CWnd::*)(CPoint)' Cast from base to derived requires dynamic_cast or static_cast

    解决办法:修改OnNcHitTest的原型:

    VC6:afx_msg UINT OnNcHitTest(CPointpoint); ->

    VS2005:afx_msg LRESULT OnNcHitTest(CPointpoint);

6. error C2440: 'static_cast' :cannot convert from 'void (__thiscall CSettingStart::* )(BOOL,HANDLE)' to 'void(__thiscall CWnd::* )(BOOL,DWORD)'

    ON_WM_ACTIVATEAPP 的消息处理函数原型:

    VC6:afx_msg void OnActivateApp( BOOL,HANDLE);

    VS2005:afx_msg void OnActivateApp( BOOL,DWORD );


二.  其它问题

1. 以前可以这样用try

  catch(CException*e)
  {
      pApp->Warn("%s",e->GetErrorMessage);

       e->Delete();

       return FALSE;

  }

    现在必须修改为:

  catch(CException*e)
  {
     TCHAR errormsg[255];
     e->GetErrorMessage(errormsg,255,NULL);
     pApp->Warn("%s",errormsg);
     e->Delete();
     return FALSE;
  }
2. strchr必须强制转换一下。

    VC6:char *str2=strchr(line,'|');

    VS2005: char *str2=(char *)strchr(line,'|');

3. VS2005中有些可能引起内存越界的函数不建议使用。

  char c[10];
  strcpy(c, "testtestts"); //ok with VC6, but not in VS2005
  strcpy_s(c, _countof(c),"testtestt");//9 chars, ok inVS2005
  strcpy_s(c, _countof(c),"testtestt");//10 chars,assert!!!!! in VS2005
4. error LNK2019: unresolvedexternal symbol "wchar_t * __stdcall _com_util::Co.....

    解决方法:Property page ->C/C++ ->Language ->treatWchar-t   改为 No

5. 字符处理

    在c中广泛使用的strcpy,strcat,strstr等等推荐使用更为安全的strcpy_s,strcat_s,strstr_s等来代替。

6. 数学函数检查

 VS2005中,数学函数的参数检查更为严格,如pow(2, 45)会引起一个错误提示如下:

    error C2668: “pow”: 对重载函数的调用不明确

    d:\program files\microsoft visual studio8\vc\include\math.h(575): 可能是“long double pow(long double,int)”

    d:\program files\microsoft visual studio8\vc\include\math.h(527): 或“float pow(float,int)”

    d:\program files\microsoft visual studio8\vc\include\math.h(489): 或“double pow(double,int)”

    试图匹配参数列表“(int, int)”时,正确的使用为pow(2.0, 45)

7. 更加符合C++标准

    在VC6中,在for循环中的循环变量的定义的作用域延伸到循环体外,VS2005则修正了这样的bug。

    在VC6中:

  for(int i=0;i<100;i++)
  {
    f2();
  }

  for(i = 1;i<10;i++)
  { //i已经定义
    f1();
  }

    而有VS2005中,第二个循环中的i必须重新定义。

8. Create问题

    CDlg *dlg=new CDlg;

    dlg->create(IDD_DLG,this);//出错之处

    error C2660: 'Create' : function does nottake 2 parameters且我将第二个参数去掉的时候,又会显示

    error C2660: 'Create' : function does nottake 1 parameters19.error C2871: 'System' : a namespace with this name does notexist

    原因:这个错误只能说VC编译器还不够智能啊

    解决办法:在使用前需要使用Common Language Runtime Support (/clr).

    在配置属性中,选择general-》选择clc (ConfigurationProperties/General/Common Language Runtime support)

 


VC6.0升级至VS2005 引发的一些问题 最近开发平台由VC6.0升级至VS2005,需要将原有的项目迁移,特将碰到的问题归纳如下:1消息映射VS2005对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2005下编译不通过a. ON_MESSAGE(message,OnMyMessage);   OnMyMessage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMyMessage(WPAR 阅读详情

相关推荐

VC6.0VS2005VS2008安装STLport-5.2.1

  今天为了装STLport,搞了很久,主要是新版本以致搞VC6.0时,有很多要注意的。前文:  下载STLport源代码,解压到一个目录,例如:C:/STLport-5.2.1。下面我都用 %STLport% 表示解压的完全路径。根据解压的不同,各位用自己的目录替换这里的 %STLport% 就是(有点罗嗦了)。VC6.0安装STLport-5.2.1:  1、首先在…/Microsoft Visual Studio/VC98/Bin/VCVARS32.BAT中, 把%STLport%/stlport;

whutxinriyue的专栏 4157

VC6.0代码向VS2005迁移遇到的问题与解决

 VC2005VC6的编译环境,库的支持有诸多的不同,所以直接迁移有很多无法预料的风险。目前遇到的主要问题如下:1. MFC类库有些类的接口定义已发生改变,如CRichEditCtrl::CreateEx函数,CWnd:: OnActivateApp消息相应函数。2. 库支持方面的更改,目前ToolsSDK库是VC6环境下编译的,其中有些函数依赖于VC6下的一些特定库,直接把VC6

成长伴随牢骚 2751

VC6+WinDDK,VS2005+DDKWizard环境配置的一些记录

VC6+WinDDK:    1.按照windows驱动开发技术详解(张帆编)的说明,包含目录在vc6当中记得提升到最上面,不然会出现这样那样的错误.    2.提示'specstrings.h': No such file or directory,把inc下面的crt目录也包含进来可以解决    3.提示类似missing ';' before identifier 'Lock',请把wxp的包含目录去掉,包含需要的目录(请试试wdm目录),另外参考第一条    4.如果提示编译器不支持编译,cl.ex

GaA.Ra的自留地 in Csdn 3046

VC6VC9移植代码问题总结收藏

 首先可以直接用Visual Studio 2008的打开VC6的工作区文件和项目文件(dsw和dsp),并将其升级为VS2008的解决方案格式和项目格式(sln和vcproj),VC9的编译器相对于VC6有了很大的变化,一些编译参数和链接参数被废弃(比如/map:line),有一些改变了名称,还有新增的选项,不过不用担心,升级过程会自动对其进行换,最终都会得到一个正确的解决方案和VC项目文件,

Augusdi的专栏 2558

VC6.0 VS2005

AutoPDMS8.0源码使用高版本ObjectARX(2004/2007)编译的总结以下是引用uesoft在2007-11-21 15:14:29的发言:原文作者:杨志军,长沙优易软件开发有限公司CAD部AutoPDMS8.0源码使用高版本ObjectARX(2004/2007)编译的总结一、开始编译之前1. ObjectARX 2002工程向ObjectARX 2004工程升迁时的准备工作1.1 编译工具AutoPDMS8.0是在VC 6.0下开发的,使用ARX 2002(含)以下的版本时,用VC 6.

fly_902的专栏 4938

vc6.0vs2005不适之处(一)——字符集

参考:http://jingyan.baidu.com/article/6525d4b1090139ac7d2e9413.html vs2005默认设置是Unicode字符集,vc6.0默认multi-byte多字符集。当我们试图用vc6.0上正确的程序在vs2005上运行时,第一个碰到的问题就会是它。 MessageBox( hwnd, "ok", "message", 0 ); 这样

擦擦擦 1017

VC++6.0的代码迁移到VS2005常见问题总结(Window核心编程第五版以前代码在VS2005无法编译的解决方案)...

额喜新厌旧是男人的通病吧,可是呢VS2005的界面看着的确比VC6.0看着舒服,而且也算用习惯了吧。可是网上现在大部分C/C++的代码还是用VC6.0的。这为我们这些菜鸟的学习之路增添了不少障碍,可能有很多朋友在这一步就放弃了吧或者抹黑走下去,很痛苦我也是刚刚找到些窍门就拿Windows核心编程这本书的代码来做个例子吧 第一用VS2005打开项目编译之后看到最多的错误大概就是 error C4...

weixin_30652271的博客 164

vc6.0 直接vs2005vs2010 其中要注意的问题总结

1、去除VS2010对汉字的拼写检查后留下的红色波浪线  不关VS的事,原因在于visual assist。 在VAssistX菜单栏->Visual Assist X Options->展开Advanced->Underlines->把underlines spelling errors in comments and strings using的勾去掉就行了。 2、VS2010默认配置里

liulina603的专栏 3294

开发平台由VC6.0升级至VS2005,将碰到的问题

最近开发平台由VC6.0升级至VS2005,特将碰到的问题归纳如下:1消息映射VS2005对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2005下编译不通过a. ON_MESSAGE(message,OnMyMessage);OnMyMessage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);如果

VERGIL.C's专栏 862

vc6.0程序向VS2005移植

vc6.0编译成功的程序要移植到VS2005中运行 如果不加修改 会出现很多错误问题的原因是字符串ANSI和Unicode编码的区别, VC6VS2003等默认使用ANSI编码,而VS2005VS2008默认采用Unicode. 简而言之 ANSI用1个字节表示字符,Unicode用2个字节表示1个字符. 若想要你的代码在VS2005中编译通过,3中方法:

bitwjg的专栏 1391

vc6.0vs中出现的错误解析!(有感于sift和surf移植)

<br /> <br />从vc6.0vs2005 2008出现的错误解析<br />遇到问题咯,的别人的文章~~<br />最近开发平台由VC6.0升级至VS2005,需要将原有的项目迁移,特将碰到的问题归纳如下:<br /><br />1消息映射<br />VS2005对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2005下编译不通过<br /><br />a. ON_MESSAGE(message,OnMyMessage);<br />OnMyMessage返回值必须为LRES

三少GG 2159

VC6项目VS2005问题,100分请教

  在VC6中用MFC和API开发的项目,生成的release版,在多台电脑上测试通过。现在需要在VS2005中继续开发该项目。将项目2005中后,在没有添加任何代码的情况下,生成的release版只能在自己的电脑中运行。在多台没有安装VS2005的机器中运行,都提示“应用程序未能正确配置,重新安装该程序...”项目属性无CLR支持。通过dependence工具,发现缺少mfc80ud

looob的专栏 1141

VS2008/2005VC6.0的一点区别

1.MessageBox() VC++6.0:MessageBox("Hello,World!"); VS2008:MessageBox(L"Hello,World!"); 或 MessageBox(TEXT("Hello,World!")); 2.Combo box内容添加方法 VC++6.0:Drop-Down List Box Control 的 Properties 中的 Data 用 C

超越梦想的专栏 3205

vc6.0vs2005 2008等出现的错误详解(HYD整理)

vc6.0vs2005 2008等出现的错误详解(HYD整理)       最近开发平台由VC6.0升级至VS2005,需要将原有的项目迁移,特将碰到的问题归纳如下:1消息映射VS2005对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2005下编译不通过a. ON_MESSAGE(message,OnMyMessage);   OnMyMessage返回值必

1551

VC6.0VS2005的一些差别

分类: 一、         VC 6.0 中的 MFC ClassWizard 从 Visual Studio 2005 开始已被分拆成两个功能: 1.     对控件和菜单建立事件映射的功能 菜单视图 (View)->Solution Explorer 或 Ctrl+W,S 中 Resource Files 树下,在资源视图(通过双击资源文件 *.rc 可进入该视图)选中某一个菜单或者

Tank_huenyifei的专栏 728

VC6迁移至VS2005

最近开发平台由VC6.0升级至VS2005,需要将原有的项目迁移,特将碰到的问题归纳如下:1消息映射VS2005对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2005下编译不通过a. ON_MESSAGE(message,OnMyMessage);  OnMyMessage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMyMessage(WPARA

jia_xiaoxin的专栏 2383

VC6.0VS2005VS2008安装STLport-5.2.1(

<br />VC6.0VS2005VS2008安装STLport-5.2.1<br /> <br />   最近在帮人做的一个项目中用到了STL;我自己使用的是VS2005,后来移植到VC6.0的时候,出现了很离奇的错误,就怀疑是VC的STL版本出了问题.从网上找到了 STLport-5.2.1,但是不会安装,于是从网上找到了这篇文章,按照其中的步骤顺利的进行了安装,然后果真顺利的解决了问题!<br />    顺便说一句:如果有人使用老旧的VC6.0出现了问题,可不要总是怀疑自己的代码有问题呀!那个东

wxWidgets911的专栏 694

VS2005/2008中兼容VC6.0项目的LIBCDlib库获取指南

在遇到旧代码中的宏或常量与新版本Visual Studio不兼容的情况时,可以通过定义预处理器指令来解决。预处理器指令允许在编译之前对代码进行文本替换,从而可以在不影响源代码的情况下解决兼容性问题。开发者可以根据新版本的Visual Studio环境调整预处理器定义。例如,如果某个旧宏定义已经不再被支持,可以定义一个新的宏来替代它。下面是一个简单的代码示例:// 旧代码中的宏定义// 一些依赖旧宏定义的代码#endif// 新版本VS中的定义。

weixin_35811662的博客 888
上一篇: 在VS2005中使用OCX控件
下一篇: 自定义MFC打开/保存对话框的扩展名
skywalker_leo
博客等级 码龄21年 165粉丝 59原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值