从VC6升级到vs2010需要修改的部分经验交流

因为适应平台的需要,需将之前的vc6程序升级到vs2010的平台,升级的过程,各种不顺利,现特整理了部分容易遇到的问题,分享给小伙伴,少走弯路!

1. 将头文件中#include <iostream.h>改为#include <iostream>

2. 将头文件中#include <fstream.h>改为

#include <fstream>

Using namespace std;

3. error C2039: “nocreate”: 不是“std::basic_ios<_Elem,_Traits>”的成员

改nocreate为_Nocreate;

4. pow(x,y)函数定义,x不能为int型,因此要进行转换,比如pow(2,3)必须写成pow(2.0,3)pow( ((float)2,3)

5. 参数1不能从“const char[20]”转换为“LPCTSTR”类型是什么意思

    如果是windows程序的话,就是设置的问题,项目-属性-常规-字符集-使用多字节字符集。

6. error C2666: “pow” : 7 个重载有相似的转换(错误修改方法)

pow函数有7个重载,编译器不知道该用哪一个(因为参数类型不明确),在参数中使用常数或表达式时经常遇到这样的问题,可以把常数和表达式的值先保存到变量中,然后再调用函数,或者在函数的参数中加上强制类型转换。两个参数的类型明确并符合其中的一个就可以了。

7. “VC 2010 项目过大” 问题解决方案

    使用VC2010建立C++解决方案时,会生成SolutionName.sdf和一个叫做ipch的文件夹,这两个文件再加上*.pch等文件使得工程变得非常的庞大。
方案一:Tools->Options->Text Editor->C/C++->Advanced->Disable Database,设置为True,即禁用数据库,这种方法实行后,还真是产生了些问题,比如,无法自动加载代码。为此,就没有使用此方法。
方案二:Tools->Options->Text Editor->C/C++->Advanced,在 Fallback Location 的属性组中,将"Always Use Fallback Location"设置为 true,将"Do Not Warn If Fallback Location Used" 设置为 true ,然后删除解决方案目录下的 sdf 文件和 ipch 目录,再次打开解决方案,发现这些烦人的东西已经不见了。中文版得为,在高级里,“退回位置”两个选项都变为True。
这样一来,几百兆的项目,用清理工具一清理,也能变成几百K了。
那么那些文件放置到那里了呢?看 "Fallback Location" 属性说明:这是存储浏览信息数据库和 IntelliSense 文件的第二个位置,如果不指定则放置到临时目录中;到临时目录一看,里面有一个 VC++ 的目录,都在那个目录里面呢。
可以 "Fallback Location" 属性中,设置一个固定的路径来存储这些文件,比如D:\VS2010Temp,这样也比较好管理这些庞大的臃肿的文件,可以定期清理掉它们,释放出硬盘空间!

8.  程序中,菜单和工具栏图标的移植。

    菜单:打开原来的工程,选中菜单栏的某个弹出菜单,复制(Ctrl+C,再在新建的工程中的菜单栏中点击空白项,粘贴(ctrl+V,可以将其整个菜单复制到新工程中,不过要注意这样只能复制菜单的ID号,不能复制菜单的说明(Prompt属性)。因此要复制它。

工具栏图标(toolbar):打开原来的工程,选择toolbar中的某个图标,复制(Ctrl+C,再在新建的工程中的toolbar中点击空白项,粘贴(Ctrl+V)。这个只能复制图标,不能复制它的ID号及prompt属性,要格外复制。

可以在当前工程中资源视图中打开至少两个资源,在其中一个资源窗口点击右键,然后选择“建立水平选项卡组”,这样在工程中出现两个资源显示窗口,再在当前工程中打开需要拷贝工程的资源文件(*.rc文件)。再调整窗口,使两个工程的资源文件在上下两个选项卡组中。点击要拷贝的资源(菜单,工具栏图标),再按住ctrl,同时用鼠标将要拷贝的资源拖曳到没有这个资源的工程对应的视图中即可。(按常理来说,这样能复制资源的所有信息,不过复制完之后还是要注意检查,看看是否资源的所有信息都已复制,没有复制的在添加。)

9. 将资源添加完并将ID号修改好之后,打开类视图窗口,找到App类的InitInstance()函数中下面一段话。

 从VC6升级到vs2010需要修改的部分经验交流

    将IDR_ana_santsTYPE改成新的菜单的ID号。

10. 改变工具栏图标大小,编译成功,运行出错的解决办法

改变工具栏图标大小后,运行程序,出错,如下图:点击忽略可以运行程序,不过不是好的解决办法。

 从VC6升级到vs2010需要修改的部分经验交流

解决办法为:

1) 打开工程的MainFrm.cpp文件,找到OnCreate()函数,在下列语句中添加语句

if (CMFCToolBar::GetUserImages() == NULL)

{

// ¨®?®?¡ì¡§°?Ì?¡è?¤?ª??

if (m_UserImages.Load(_T(".\\UserImages.bmp")))

{

// m_UserImages.SetImageSize(CSize(35, 32), FALSE);

CMFCToolBar::SetUserImages(&m_UserImages);

}

}

2) 直接删除上面所有的语句

3) 在创建工具栏的语句的前面加上1)中添加的语句,即

从VC6升级到vs2010需要修改的部分经验交流 

参考网址:http://www.cppblog.com/neverwinter/archive/2010/05/20/115984.html

11. 工具栏一行显示不完的解决方法。

在网上搜索了很久,一条工具栏分成两行显示的程序没有调试出来,为了完全显示工具栏,暂定方法是将一条工具栏做成两条工具栏。

在MainFrm.h中定义CMFCToolBar类的变量m_wndToolBar1;

然后在MainFrm.cpp文件的CMainFrame::OnCreate函数中添加以下绿色程序

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))

{

TRACE0("未能创建工具栏\n");

return -1;      // 未能创建

}

if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,CRect(1, 1, 1, 1),IDR_MAINFRAME_257) ||

    !m_wndToolBar1.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_257 : 0))

{

TRACE0("未能创建工具栏\n");

return -1;      // 未能创建

}

 

CString strToolBarName;

bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);

ASSERT(bNameValid);

m_wndToolBar.SetWindowText(strToolBarName);

m_wndToolBar1.SetWindowText("工具栏2");

CString strCustomize;

bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);

ASSERT(bNameValid);

m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);

m_wndToolBar1.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);

// 允许用户定义的工具栏操作:

InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId);

 

if (!m_wndStatusBar.Create(this))

{

TRACE0("未能创建状态栏\n");

return -1;      // 未能创建

}

m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

 

// TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行

m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockPane(&m_wndMenuBar);

DockPane(&m_wndToolBar);

DockPane(&m_wndToolBar1);

12. 帮助文件的制作

l 在新建工程时勾选区分上下文的帮助复选框,软件自动生成帮助文件样板,并生成hlp文件夹,里面包含帮助文件工程和各种帮助主题。

 

l 新建完工程后,直接生成解决方案并运行程序。查看帮助文件是否可用(这样做的实际目的是让帮助文件的工程中的.h文件能出现上下文敏感帮助ID值,如果不事先编译一下可能出现.h文件里面无内容的情况。)

l 在工程中打开帮助文件工程.h文件(hlp文件夹里面的HTMLDefines.h),添加工具栏图标的上下文ID。可以将resource.h文件里面工具栏ID定义拷贝到HTMLDefines.h文件中的// Commands (HID_*) 下面。然后在ID号前面加上H,将ID值加上65536并转换成16进制即可。例如:

数据采集设定在resource.h中定义如下

#define ID_PC_DEVSET                    32771

将其拷贝到// Commands (HID_*)下面,并将其修改成下面的语句。

// Commands (HID_*)

#define HID_PC_DEVSET                    0x18003

注:一般下面有程序自带的帮助ID,我们将语句拷贝到程序自带的帮助ID后即可;

0x18003=98307=32771+65536

修改完帮助ID后,保存工程的所有文件。然后制作帮助主题文件(.htm文件)。并将文件保存为对应帮助ID。(如,数据采集设定的帮助ID为HID_PC_DEVSET,那么数据采集设定的帮助主题文件就保存为:hid_pc_devset.htm。)

制作完帮助主题文件后,在工程中的hlp文件夹中打开帮助工程(*.hhp文件),双击打开后,跟以前制作帮助文件的步骤一样,这里就不赘述。

注:将打开、保存工具栏的帮助主题文件替换成我们自己编写的帮助主题文件;在做目录时,新建一个工具栏标题(insert a heading),在其后添加帮助目录。

13.打开工程,如果出现资源视图和类视图无法查看的情况,将之前工程所设置的放置缓存文件的文件里的相关文件全部删除,再打开工程就可以了。

14.重新排列工具栏图标,再生成解决方案,这时我们需注意:有可能出现执行程序的工具栏图标未改变的情况,这时,打开执行程序,将工具栏图标全部重置即可。

15错误 116 IntelliSense: #error 指令: Please use the /MD switch for _AFXDLL builds d:\vs2010\vc\atlmfc\include\afxver_.h 81

 从VC6升级到vs2010需要修改的部分经验交流

16错误

 从VC6升级到vs2010需要修改的部分经验交流

错误原因是解压压缩包时多了一层目录,将目录删除一层再重新生成即可。


17. 编译通过,运行出现这个错误,调试程序,找到出错的行。如PCL_PCCSTS里出现过此错误,

从VC6升级到vs2010需要修改的部分经验交流

错误指向PCL_DLL.dll里地址为4023的地方,观察发现,resouce.h文件中,对话框的ID要跟这个对话框第一个控件的ID一致(也有可能是任意一个控件都可以,但是必须要跟某个控件的ID一致)。把4023所对应的Analongpile那个对话框的ID改成4023就可以了(它以前在最后ID是12010)。                        

还有一个原因可能是因为复制程序时,原有程序的对话框中单选框组定义了控件变量,而新程序只复制了程序,却没有设置其对话框中第一个单选框的group属性为true。

出现上述错误的原因一般是因为是你为一个控件进行变量绑定,后来你觉得这个控件没用了,就直接在对话框上把控件删除了或者是改变了,而这里的关联代码却没删除。解决方法是在安装目录下找到错误提示的路径,

从VC6升级到vs2010需要修改的部分经验交流

dlgdata.cpp 拖到当前项目的vs2010 环境,打开dlgdata.cpp后,在第40行处设断点,点绿色运行按钮,到断点处找到nIDC,然后找到对应的 ID。。。

注释掉相关行,如

//DDX_Control(pDX, IDC_Edit1, m_xxxx);

并把IDC_Edit1注释掉,m_xxxx 也注释掉,再次运行就可以了。

结论:以后删除控件前,先取消对控件的变量绑定,然后再删除控件。

18. 1>LINK : warning LNK4098: 默?认?库a“°MSVCRT”±与?其?他?库a的?使?用?冲?突?;?请?使?用? /NODEFAULTLIB:library

 

警告信息如下:

 

1>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

 

原因:

在使用多线程调试dllMDd)模式的时候 <位置:配置属性 - c/c++ - 代码生成-运行时库>

 

msvcrtd.lib  ibcmt.lib产生冲突

 

解决方法有2个:

 

1.右击工程 - 属性 配置属性 - 链接器 - 输入 - 忽略特定库,添加 ”libcmt.lib“

 

2.右击工程 - 属性 配置属性 - 链接器 - 命令行添加:  /NODEFAULTLIB:"libcmt.lib"

在这里,我们只需要把库统一成多线程调试DLL(/MDd)即可。

 从VC6升级到vs2010需要修改的部分经验交流

 

debug assertion failed file:f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winctrl3.cpp line:234