在vc6工程转为vc2017工程中,可以直接用vc2017将工程升级。但是有一些错误提示要按提示,修改。其中最大的一个问题是下文的第5条,最后发现是LASLib.lib的版本太老导致的问题。只要把这个llib对应的函数注释掉就可以。laslib可以使用高版本的。
另外,我也尝试了在vc2017新建“文档/视图”程序,将将其移动过去。其实根据就搞错了,原来的程序是基于对话框,“文档/视图”模式会出错。
1、编译错误C2065 “i”: 未声明的标识符
解决办法,将
for (int i = 0; i < m_deviceList.size(); i++)
{
m_ctlDevicelist.AddString(m_deviceList[i]);
}
中变量i的定义放到函数体开头
int i;
for (i = 0; i < m_deviceList.size(); i++)
{
m_ctlDevicelist.AddString(m_deviceList[i]);
}
2、 fopen建议修改为fopen_s
关闭sdl检查即可或或者听从建议使用fopen_s
3、关于error LNK2005的解决办法
项目中出现这个错误的原因是:原始工程为TowerTreat,工程中有个TowerTreat.cpp,文件中定义了CAboutDlg类,但是在vs 2017中我将工程名称改为了TowerModeler,TowerModeler.cpp中也有一个CAboutDlg类,这样在链接的时候会冲突。
4、error LNK2019: 无法解析的外部符号
出现原因是没有配置相关的lib(我的项目中包括opengl的库,opengl的配置:https://blog.csdn.net/kiaralovelysheep/article/details/81735794)
5、LNK1104 无法打开文件“LIBCD.lib”
出现这类问题一般是由于所运行的项目是VC6(或者vs2003)创建的,而后又用VS2005或者更高版本工具打开项目导致的,原因都是因为LIBCD.lib文件被更改了.要解决问题的话,只要在链接设置那里忽略它就没问题了。
解决办法是:
第一种方案:在项目-属性-链接器- 命令行 加 /nodefaultlib:libcd
第二种方案:在项目-属性-链接器- 输入-忽略特定库加:LIBCD.lib
两种方法都可以。
参考自:https://www.cnblogs.com/hyfemma/archive/2010/11/14/1876846.html
6、错误 LNK2005 "class _AFX_THREAD_STATE * __stdcall AfxGetThreadState(void)" (?AfxGetThreadState@@YGPAV_AFX_THREAD_STATE@@XZ) 已经在 mfc140d.lib(mfc140d.dll) 中定义 TowerModeler D: eposGridModelerTowerModeler afxcwd.lib(afxstate.obj) 1
7、严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK1112 模块计算机类型“x64”与目标计算机类型“x86”冲突 TowerModeler D:
eposGridModelerTowerModelerucrtd.lib(ucrtbased.dll) 1
https://blog.csdn.net/tfy1028/article/details/8660823
8、IntelliSense: "char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容
https://blog.csdn.net/quinn1994/article/details/94618725
9、/ZI”和“/Gy-”命令行选项不兼容
https://jingyan.baidu.com/article/46650658fcec97f549e5f826.html
10、错误 LNK2026 模块对于 SAFESEH 映像是不安全的。 TowerTreat D: eposDNPowerGridModelBuilderLASlib.lib(lasreader.obj)
https://jingyan.baidu.com/article/47a29f24334312c01423992e.html
11 0x00007FFF51140BCB (mfc140d.dll)处(位于 TowerModeler.exe 中)引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
12 引发了未经处理的异常:读取访问权限冲突。 this 是 nullptr。
在vc 6.0中可以这样获取句柄:CTowerTreatDlg* mainWnd = (CTowerTreatDlg*)AfxGetMainWnd();
但是在visual studio中不行。我们可以先获取app,再通过app的m_pMainWnd转化。
CTowerTreatApp* application = (CTowerTreatApp*)AfxGetApp();
CTowerTreatDlg* mainWnd = (CTowerTreatDlg*)application->m_pMainWnd;