使用 VS 打开 VC++6.0 创建的 MFC 项目

大一的我年少无知,学 C 语言时老师叫我们每位同学学习使用 VC++6.0,就此成为了经典传承人之一。突然有一天,我发现我再也无法忍受它没有一点现代美感且过气的界面,由此开始了我寻找最美编译器之旅,与此同时也揭开了我所学的计算机专业的真相——严重与社会需求脱节。大四为了凑够学分,选修了 Visual C++,学院教授在讲台上侃侃而谈,熟练地操作的经典永流传的 VC++6.0。我平静地坐在台下,内心毫无波澜。

故事讲完了,开始干活了。需要说明的是,笔者使用的 VS 是 2019 版本, 且已安装了运行 MFC 项目的环境。VS2017 ~ VS2019 理论上不会有兼容性问题。开始正题,使用 VS2019 打开原本 VC++6.0 创建的 MFC 项目,导入项目后 VS2019 会出现如下提示:

image-20211123141214451

点击确定,转换并导入成功后,点击 Debug 进行调试,会出现错误提示,如下图:

image-20211123150441662

解决方案:

  1. 点击 【项目】=》【属性】=》【C/C++】=》【启用函数集链接】=》选择【是 (/Gy)】

image-20211123150640069

  1. 点击 【项目】=》【属性】=》【C/C++】=》【常规】=》【调试信息格式】=》选择【程序数据库(/Zi)】或【无】

image-20211123151236366

点击【应用】后,再次 Debug 调试运行,出现新错误,如下:

image-20211123151650364

解决方案:

image-20211123152236594

以上两个错误是最基本的 VC++6.0 转到 VS2019 时遇到的基本错误,根据项目的源码 不同,可能还出现以下情况,都是我在 Copy 代码时遇到的,具体如下:

  • 运算符不匹配,原因是 CString 在 VS 和 VC++6.0 两个环境下的解码方式不同。

image-20211123214735922

**解决方案:**点击 【项目】=》【属性】=》【高级】=》【字符集】=》选择【未设置)】或【使用多字节字符集】

image-20211123220408814

  • 读取文件时是可能会出现如下错误:

    image-20211123220614846

解决方案:

image-20211123221455315

以上是我初次探索 MFC 项目在过程中所遇问题的总结。都快 2022 年了,还在学 MFC ,卑微 =_=

参考博客:VC++6.0的MFC项目迁移到vs2019

参考博客:error C2593: “operator +=”不明确

参考博客:error C2039: “nocreate”: 不是"std::basic_ios<char,std::char_traits>

  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一个简单的 VC++6.0 MFC 应用程序,演示如何使用 MFC 实现串口通信: 1. 创建一个 MFC 对话框应用程序。 2. 在 CMyDialog 类的头文件中添加以下成员变量: ```c++ HANDLE m_hComm; OVERLAPPED m_osRead; OVERLAPPED m_osWrite; ``` 3. 在 OnInitDialog 函数中初始化串口: ```c++ CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); // 初始化串口 m_hComm = CreateFile(_T("COM1"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (m_hComm == INVALID_HANDLE_VALUE) { MessageBox(_T("无法打开串口"), _T("错误"), MB_OK); return TRUE; } SetupComm(m_hComm, 1024, 1024); DCB dcb; GetCommState(m_hComm, &dcb); dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(m_hComm, &dcb); PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); // 初始化读写事件 m_osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); m_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); return TRUE; } ``` 4. 在 OnOK 函数中关闭串口: ```c++ CMyDialog::OnOK() { CloseHandle(m_osRead.hEvent); CloseHandle(m_osWrite.hEvent); CloseHandle(m_hComm); CDialog::OnOK(); } ``` 5. 实现一个函数来读取串口数据: ```c++ void CMyDialog::ReadFromPort() { char buf[1024]; DWORD dwRead; if (!ReadFile(m_hComm, buf, 1024, &dwRead, &m_osRead)) { if (GetLastError() != ERROR_IO_PENDING) { // 读取失败 return; } } WaitForSingleObject(m_osRead.hEvent, INFINITE); if (!GetOverlappedResult(m_hComm, &m_osRead, &dwRead, TRUE)) { // 获取结果失败 return; } // 处理读取到的数据 buf[dwRead] = '\0'; AfxMessageBox(buf); } ``` 6. 实现一个函数来写入串口数据: ```c++ void CMyDialog::WriteToPort(LPCTSTR lpBuf) { DWORD dwWritten; if (!WriteFile(m_hComm, lpBuf, _tcslen(lpBuf), &dwWritten, &m_osWrite)) { if (GetLastError() != ERROR_IO_PENDING) { // 写入失败 return; } } WaitForSingleObject(m_osWrite.hEvent, INFINITE); if (!GetOverlappedResult(m_hComm, &m_osWrite, &dwWritten, TRUE)) { // 获取结果失败 return; } // 写入成功 } ``` 7. 在需要读取或写入串口数据的地方调用上述函数即可。例如,在按钮点击事件中读取串口数据: ```c++ void CMyDialog::OnButtonRead() { ReadFromPort(); } ``` 注意,以上代码只是一个简单的示例,实际应用中还需要进行错误处理和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识焦虑症患者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值