将VC ++ 6 / Win32项目转换为VS2010 C ++ / Win32项目:已知问题

时间:2011-03-08 13:15:55

标签: c++ visual-studio-2010 winapi mfc migration

您是否知道在 VC ++ 6 / Win32 项目转换为 VS2010 C ++ / Win32 项目类型期间突出显示已知或可能出现的问题的资源?我对各种问题感兴趣:

  • 编译器选项兼容性
  • 编译时问题
  • 链接时间问题
  • 运行时问题
  • MFC问题

否则,如果您已经执行了那种迁移,那么您遇到了哪些问题?

谢谢

8 个答案:

答案 0 :(得分:5)

VC ++ 6具有非标准的异常处理。我们遇到了一些问题,因为我们的代码包含:

try { 
  //Some code
} 
catch (...) {
  //Handle error
}

在VS2008中编译后,一些开发人员依赖于这种破坏的行为,我们的应用程序崩溃严重。

这个article解释得很清楚以及如何解决这个问题。

答案 1 :(得分:3)

  1. 首先,这些问题高度依赖于代码质量以及古代代码如何适应VC ++ 6编译器的“功能”。

  2. 无法直接将.dsp转换为VS 2010格式(at least with the express editions),您必须通过2008才能转换。

  3. 转换向导应该发出警告并告知您可能存在的任何问题。我没有经历过这个过程,但我认为编译器开关是你最不担心的。一般来说,我希望错误的代码会产生更多你需要担心的错误。

  4. 关于您的具体问题:

    • 见3.
    • VS2010需要更长时间。
    • VS2010链接器需要更长时间,特别是如果启用链接时优化(在VS 2005中引入)
    • 仅当您做出非标准假设或VC ++ 6具有非标准功能时。只要您使用VS2010重新编译整个项目(并因此将其链接到最新的VC(++)运行时),就不会出现运行时问题。

    旁注:我不是说旧代码 不好,只是关于VC ++ 6的很多问题都是由于代码质量不好造成的/一致性。

答案 2 :(得分:3)

嘿,vs6允许你在循环范围之外使用循环变量。即:

for ( int i=0; i<10; i++ )
{
   if( i == 5 )
     break;
}

int iVal = i;

任何事情都会失败&gt; vs6 :)在2005年和2010年失败 - 虽然有一个编译器设置可以让你再次强制这种行为(我建议只是修复它,不要强迫它,它的不合规无论如何),至少在vs2005中。我还没有进入2010年,因为我进行了大量的嵌入式开发,看起来嵌入式内容的转换编译器通常是一个很大的痛苦。所以,对于2010年我不能说太多,但我知道这是贯彻始终的!

答案 3 :(得分:2)

你会遇到很多问题,因为VC6出了名的不合适,你的代码(特别是如果你使用了模板)可能会充满黑客,让它不再需要工作,因为MS做了很多对于更新的编译器版本的一致性工作,VC10编译器可能会对它们进行限制。

答案 4 :(得分:2)

这一举动,我所知道的两个痛苦问题:
- VC6和更高版本之间的异常处理默认值已更改。我相信/Eh是默认值,而且已经发生了变化 - 自Win2k以来,VC6运行时(msvcrt DLL)包含在任何Windows操作系统中,而对于任何其他版本,您需要将其与您的软件一起安装在几乎任何操作系统中。

答案 5 :(得分:2)

如果你有商业版的Visual C ++:

在Visual C ++安装目录中查找devenv(应为%VS90COMNTOOLS%\..\IDE\devenv.exe

    > devenv /upgrade project.sln

    > msbuild.exe project.sln  /t:Build  /p:Configuration=Release /p:Platform=Win32

检查编译

但是如果您有免费版的Visual C ++:

在Visual C ++安装目录中找到vcbuild.exe(应为%PROGRAMFILES%\Microsoft Visual Studio 9.0\VC\vcpackages\vcbuild.exe

    > vcbuild.exe /upgrade   project.sln
      /msbuild:Configuration=Release
      /msbuild:Platform=Win32

对于不需要转换的未来版本,请键入:

> msbuild.exe project.sln /t:Build /p:Configuration=Release /p:Platform=Win32

答案 6 :(得分:2)

从VS2005迁移到VS2010时,我们遇到了第三方库的问题,导致我们的程序在每次加载时崩溃。问题原来是微软在链接器中反转/ NXCOMPAT开关的默认设置。该开关控制是否启用数据执行保护(DEP)。在VS2010之前,该开关的默认设置为NO,我们使用的DLL显然依赖于该设置才能正常工作。

我不确定NXCOMPAT链接器开关的返回距离。它未在VS2005 对话框中可用的任何设置中列出,但是在从命令行运行link /help时列出了它。我从来没有能够从微软那里找到这样的变化列表,所以这种错误非常难以追踪。

答案 7 :(得分:1)

如果您使用CLR从VC ++ 6迁移到VS2015,则不再找到现有的最小和最大功能,添加

#define NOMINMAX
#include <algorithm>
namespace Gdiplus
{
  using std::min;
  using std::max;
};

其次,NAN float改为nan