将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) 


有什么疏忽的地方还请各位赐教


1 0
原创粉丝点击