将VC++6.0项目转换为VS2010项目时遇到的问题与解决方法
来源:互联网 发布:扫描服务器开放的端口 编辑:程序博客网 时间:2024/05/20 11:46
从VC++到VS的开发平台转换十分常见,特此记录下可能有参考价值的报错与应对方法,供参考。
我所转换的项目是一个带有GUI界面的机器人控制程序,原本在VC6平台上开发,并且可以正常运行。从学长那里拷贝到我的新电脑后,我希望用VS2010继续开发,因此实行了这次平台转换。首先双击 .dsw 文件,VS2010将会有如下提示:
选择“是”,将VC工程转化为VS2010项目。转化完成后如下:
直接F5调试,弹出提示:
选择“是”。之后我遇到了以下报错:
1)error C2440: “static_cast”: 无法从“BOOL (__thiscall CXWRobotDlg::* )(void)”转换为“AFX_PMSG”
在匹配目标类型的范围内没有具有该名称的函数
解决方法:由于VC++自动添加的消息处理函数返回值默认是void,所以需要把对应函数的返回值改为void即可。
1.点击右键转到位置,本例中是:
</pre><pre name="code" class="cpp">afx_msg bool OnBUTTONOpenDevice();afx_msg bool OnBUTTONDeviceSettings();
其中OnBUTTONOpenDevice与OnBUTTONDeviceSettings是BOOL型,需要改写成void.
2.右键OnBUTTONOpenDevice转到声明: afx_msg BOOLOnBUTTONOpenDevice(); 改为 afx_msg voidOnBUTTONOpenDevice();
3.右键OnBUTTONOpenDevice转到定义
BOOL CXWRobotDlg::OnBUTTONOpenDevice() {// TODO: Add your control notification handler code hereHANDLE hNewKeyHandle;//OpenDevicehNewKeyHandle = VCS_OpenDeviceDlg(&m_dErrorCode);if(hNewKeyHandle){//Close Previous Deviceif(m_KeyHandle) VCS_CloseDevice(m_KeyHandle,&m_dErrorCode);m_KeyHandle = hNewKeyHandle;//if(SetTimer(1,100,NULL)) m_oUpdateActive = TRUE;return TRUE;}else{AfxMessageBox("Can't open device!",MB_ICONINFORMATION);KillTimer(1); m_oUpdateActive = FALSE;return FALSE;}}
这里需要把返回类型改为void。我们利用了新定义的private bool m_open来代替返回值功能。
void CXWRobotDlg::OnBUTTONOpenDevice() {<span style="white-space:pre"></span>// TODO: Add your control notification handler code here<span style="white-space:pre"></span>HANDLE hNewKeyHandle;<span style="white-space:pre"></span>//OpenDevice<span style="white-space:pre"></span>hNewKeyHandle = VCS_OpenDeviceDlg(&m_dErrorCode);<span style="white-space:pre"></span>if(hNewKeyHandle)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>//Close Previous Device<span style="white-space:pre"></span>if(m_KeyHandle) VCS_CloseDevice(m_KeyHandle,&m_dErrorCode);<span style="white-space:pre"></span>m_KeyHandle = hNewKeyHandle;<span style="white-space:pre"></span>//<span style="white-space:pre"></span>if(SetTimer(1,100,NULL)) m_oUpdateActive = TRUE;<span style="white-space:pre"></span>//<span style="white-space:pre"></span>return TRUE;<span style="white-space:pre"></span>m_open = TRUE;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>else<span style="white-space:pre"></span>{<span style="white-space:pre"></span>AfxMessageBox("Can't open device!",MB_ICONINFORMATION);<span style="white-space:pre"></span>KillTimer(1);<span style="white-space:pre"></span>m_oUpdateActive = FALSE;<span style="white-space:pre"></span>//<span style="white-space:pre"></span>return FALSE;<span style="white-space:pre"></span>m_open = FALSE;<span style="white-space:pre"></span>}}再次调试,出现错误:
error C2451: “void”类型的条件表达式是非法的
void 类型的表达式不能转换为其他类型
右键转到位置,看到这样一句
if(OnBUTTONOpenDevice())因为我们将返回值改为了void,所以这里应该改为之前说到的m_open。
if(m_open)//OnBUTTONOpenDevice())其他类似情况的做类似处理。
2)在转换中还遇到了循环变量的报错:
error C2065: “j”: 未声明的标识符
以及
warning C4258: “i”: 忽略 For 循环中的定义;使用封闭范围中的定义
忽略“i”的定义
这里的报错是因为变量的定义与声明矛盾所产生的,算是粗心的错误。解决方法也很简单:
关于j的报错,相应代码是:
void CXWRobotDlg::Algorithm(){for(int j=0;j<40;j++){SWalkLF[j]=m_Amplitude*SWalkLF[j];SWalkRF[j]=m_Amplitude*SWalkRF[j];SWalkLH[j]=m_Amplitude*SWalkLH[j];SWalkRH[j]=m_Amplitude*SWalkRH[j];}for( j=0;j<38;j++){WalkLF[j]=m_Amplitude*WalkLF[j];WalkRF[j]=m_Amplitude*WalkRF[j];WalkLH[j]=m_Amplitude*WalkLH[j];WalkRH[j]=m_Amplitude*WalkRH[j];}for( j=0;j<20;j++){STrotLF[j]=m_Amplitude*STrotLF[j];STrotRF[j]=m_Amplitude*STrotRF[j];STrotLH[j]=m_Amplitude*STrotLH[j];STrotRH[j]=m_Amplitude*STrotRH[j];TrotLF[j]=m_Amplitude*TrotLF[j];TrotRF[j]=m_Amplitude*TrotRF[j];TrotLH[j]=m_Amplitude*TrotLH[j];TrotRH[j]=m_Amplitude*TrotRH[j];}其中下面两个for中的j提示说“未定义”。
关于i的报错,相应代码是:
for(int i=0; i<7;i++){SWLFK[i]=asin((330-250*sin(1.125-SWalkLF[i]))/150)-0.770;SWLFK[i]=SWLFK[i]*156*2000/(2*pi);}for( i=7; i<17;i++){SWLFK[i]=asin((330-250*sin(1.125-SWalkLF[i]))/150)-m_h*(m_a*(1.125-SWalkLF[i])*(1.125-SWalkLF[i])+m_b*(1.125-SWalkLF[i])+m_c)-0.770; SWLFK[i]=SWLFK[i]*156*2000/(2*pi);}for( i=17; i<35;i++){SWLFK[i]=asin((330-250*sin(1.125-SWalkLF[i]))/150)-0.770;SWLFK[i]=SWLFK[i]*156*2000/(2*pi);}......其中提示的大致意思是 i被重复定义了,只能忽略其中一个定义。
在头文件中我们发现: .h文件中只定义了 int i; 因此我们要做的就是统一定义。在此我的做法是将i和j统一在头文件中定义,在for循环中删去“int”.
3)Debug模式正常通过后,到调试时弹出报错的对话框,显示错误信息为:
“无法找到“XXX.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件。”
参考网上其他博主的解决方法可行:
解决方法:
首先打开菜单项目->项目属性页
1。选择配置属性->链接器->调试->生成调试信息改为是
2。选择配置属性->C/C++->常规->调试信息格式改为用于“编辑并继续”的程序数据库(/ZI)
3。选择配置属性->C/C++->优化->优化改为禁用(/Od)
有什么疏忽的地方还请各位赐教
- 将VC++6.0项目转换为VS2010项目时遇到的问题与解决方法
- vs2003 mfc项目转换为vs2010项目遇到的问题
- 将项目导入AS遇到的问题及解决方法集锦
- VC++6.0项目转化为VS2010及调试的相关问题
- 将vs2012的项目转化为vs2010
- 将VS2012的项目转化为VS2010
- vs2010项目转vs2013遇到的问题
- 将vs2010项目转换成vs2008项目的方法
- swift调用object-c项目遇到的问题与解决方法
- visual studio设置为使用IIS运行网站时加载项目遇到权限问题的解决方法
- visual studio设置为使用IIS运行网站时加载项目遇到权限问题的解决方法
- VC6.0项目转为VS2010遇到常见问题的解决方法
- vs2010项目转换为vs2008项目
- 将低版本的项目转换到VS2010后“无法启动程序”的问题
- 项目开发遇到的问题以及解决方法
- 【项目练习】遇到的问题和解决方法
- VS2010打开VC++6.0创建的项目
- 在练习ssh项目时遇到的问题及解决方法
- python编码 2016.09.18回顾
- Lexicographical Numbers
- JavaScript 中函数自运行
- 最短路径算法--无权最短路径
- Oracle expdp/impdp详解
- 将VC++6.0项目转换为VS2010项目时遇到的问题与解决方法
- leetcode 49. Group Anagrams
- 预定义着色器预处理宏
- 数据结构与算法分析——Java语言描述
- AIDL简单使用
- CTF-PWN练习之执行Shellcode
- QtCreator开发板远程调试
- 机器学习(二)——广义线性模型、生成学习算法
- jquery怎么选取全部非disabled的input