一、errorC2440:消息相应函数类型不能转化

  1. 问题描述
    VS2017编译提示以下两个问题:
(1)errorC2440  “static_cast”: 无法从“UINT (__thiscall CSizingControlBar::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)”
(2)errorC2440 “static_cast”: 无法从“LRESULT (__thiscall CTextProgressCtrl::* )(UINT,LPTSTR)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”
(3)errorC2440 “static_cast”: 无法从“BOOL (__thiscall CCJPagerCtrl::* )(NMPGSCROLL *,LRESULT *)”转换为“BOOL (__thiscall CCmdTarget::* )(NMHDR *,LRESULT *)”
  1. 解决方法
  • error(1)解决方法:
    通过提示的消息找到相应的消息相应函数,本次出现的问题是CSizingControlBar::OnNcHitTest,由
    afx_msg UINT OnNcHitTest(CPoint point); //VC6תVS2017-gxy-20181025
    改成
    afx_msg LRESULT OnNcHitTest(CPoint point); //VC6תVS2017-gxy-20181025
    此外函数定义的地方也要由
    UINT CSizingControlBar::OnNcHitTest(CPoint point) //VC6转VS2017-gxy-20181025
    改成
    LRESULT CSizingControlBar::OnNcHitTest(CPoint point) //VC6转VS2017-gxy-20181025
    之所以改返回的数据类型是因为,高版本的VS(好像是从VS2010开始)对消息的检查更为严格,因此这些在VC6下完全正常运行的消息映射在VS上编译不通过。
  • error(2)解决方法:
    同样的error(2)解决也需要将消息相应函数写成LRESULT *(WPARAM,LPARAM)这样的格式,跟error(1)一样直接改变形参数据类型:
    UINT换成WPARAM,LPTSTR换成LPARAM
  • error(3)解决方法:
    error(3)也需要将消息响应函数的形参改成标注的形参类型,但是这里多少有点区别,直接替换之后胡后续函数可能会有问题,我的选择是形参替换之后在函数里在强制转换回来。
    以前是这样子:
BOOL CCJPagerCtrl::OnPagerScroll(NMPGSCROLL *pNMPGScroll, LRESULT *pResult)
{*pResult = 0;switch (pNMPGScroll->iDir) {case PGF_SCROLLLEFT:case PGF_SCROLLRIGHT:case PGF_SCROLLUP:case PGF_SCROLLDOWN:break;}return 0;
}

改完之后是这样子

BOOL CCJPagerCtrl::OnPagerScroll(NMHDR *pNMPGScroll, LRESULT *pResult)
{*pResult = 0;NMPGSCROLL *pNMPGScroll_ROLL = (NMPGSCROLL *)pNMPGScroll;switch (pNMPGScroll_ROLL->iDir) {case PGF_SCROLLLEFT:case PGF_SCROLLRIGHT:case PGF_SCROLLUP:case PGF_SCROLLDOWN:break;}return 0;
}

虽然我发现,写的这个函数无论如何返回的都是0。
PS:原来NMPGCALCSIZE*是一个结构体指针,该结构体的第一个变量的类型又是NMHDR类型的结构体。


二、C2660:VS2017下使用MFC无法调用函数Htmlelp

  1. 问题描述
    VS2017编译报错如下:
E0140: 函数调用中的参数太多
C2660:   “CWind::HtmlHelpA:”函数不接受4个参数
E0167: "LPCSTR"类型的实参与“UINT”类型的形参不兼容

程序是这么写的:

#include "htmlhelp.h"
...
//通过HtmlHelp调用帮助文件(.chm)的程序代码如下:HtmlHelp(NULL, (LPCSTR)helpFile, HH_DISPLAY_TOPIC, 0);
  1. 问题分析
    F12进入HtmlHelp(文件位置是:D:\Windows Kits\10\Include\10.0.17134.0\um\HtmlHelp.h)函数定义如下
HtmlHelpA(_In_opt_ HWND hwndCaller,_In_ LPCSTR pszFile,_In_ UINT uCommand,_In_ DWORD_PTR dwData
);

但是#include "htmlhelp.h"htmlhelp.h文件应该是在本地文件夹也就是E:\Top7PlusAll\Top7PlusProject\Top7PlusSolution\graphic,感觉HtmlHelp函数所属的h文件(或者说是链接的库)不对导致这个问题的。
3. 解决方法
把上述代码改成一下就可以了
#include “htmlhelp.h”

//通过HtmlHelp调用帮助文件(.chm)的程序代码如下:::HtmlHelp(NULL, (LPCSTR)helpFile, HH_DISPLAY_TOPIC, 0);

就是仅仅在函数前边加上“::”就可以了,很奇怪


三、errorC2039:“WriteHuge”: 不是“CFile”的成员

  1. 问题描述
    在VS2017上编译提示
C2039:"WriteHuge"不是“CFile”的成员
C2039:"WriteHuge"不是“CFile”的成员
C2039:"WriteHuge"不是“CFile”的成员

程序是这样写的

CFile bf;
if (bf.Open(name, CFile::modeCreate | CFile::modeWrite)) {bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));bf.WriteHuge(lpData, size);bf.Close();}
  1. 问题分析
    原因是VC++2005及后续VC版本中的CFile没有ReadHuge和WriteHuge成员函数,只在VC6中的CFile才有,不过ReadHuge()函数已被Read()函数代替,WriteHuge()函数已被Write()函数代替。
  2. 解决方法
    遇到这种情况的解决方法把代码中的ReadHuge换成Read、WriteHuge换成Write即可,即上述程序改成如下
CFile bf;
if (bf.Open(name, CFile::modeCreate | CFile::modeWrite)) {bf.Write(&bfh, sizeof(BITMAPFILEHEADER));bf.Write(&bih, sizeof(BITMAPINFOHEADER));bf.Write(lpData, size);bf.Close();}

MFC:将工程从VC6.0工程升级到VS2017所遇到的代码不兼容问题集合相关推荐

  1. C语言学习1:从下载编译软件开始!DEV-C++、VC6.0、VS2010、VS2017等编译器的下载(Windows系统)

    目录 1.前言 2.安装配置环境(可忽略) 3.DEV-C++ 的安装 4.VC6.0的安装 5.其他编译器的下载与安装 1.前言: 学会使用编译器是学习C语言过程中不可或缺的一部分.笔者在此列举了 ...

  2. VC6.0工程设置介绍

    <script src="win.js" type="text/javascript"></script> 打开或新建一个包 含至少一个 ...

  3. MFC界面库BCGControlBar v33.0 - 全新升级Ribbon Bar、工具栏等

    亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v33.0正式发布!此版本包括对每个显示器 DPI ...

  4. VC项目配置基础 (VC6.0 和VC2005)

    转载:http://blog.csdn.net/jwcoffee/article/details/5826981 一.预处理宏 1. 通用宏 VC6.0 中: Project Setting à C/ ...

  5. VC6.0 project settings

    VC6.0project settings(VC6.0工程设置介绍) 打开或新建一个包含至少一个工程的Workspace后,VC6的Project菜单中的"Settings-"命令 ...

  6. VC6.0(VC++6.0)使用教程(使用VC6.0编写C语言程序)

    VC6.0(VC++6.0)使用教程(使用VC6.0编写C语言程序) Visual C++ 6.0简称VC或者VC6.0,是微软1998年推出的一款C/C++ IDE,界面友好,调试功能强大.VC6. ...

  7. VC6.0实现网络编程弹出一个消息框

    代码如下: #include <windows.h> INT WINAPI wWinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPWSTR IpCm ...

  8. VC6.0的一个编译错误:fatal error C1001: INTERNAL COMPILER ERROR。

    最近在编译一个VC6.0工程(开发环境:win2000+VS6.0+Sp6),在加入预编译头后出现了下面的编译错误提示: c:/program files/microsoft visual studi ...

  9. 在VC6.0中创建工程并输入源代码

    为了把程序代码输入而交给计算机,需要使用VC 6.0的编辑器来完成.如前所述,首先要创建工程以及工程工作区,而后才能输入具体程序完成所谓的"编辑"工作(注意,该步工作在四步骤中最繁 ...

最新文章

  1. miniui 加载文件时会做的一些事情
  2. Hive的基本操作-自定义函数
  3. Linux 下使用Java连接 mysql
  4. Node — 第八天 (大事件项目接口实现二)
  5. 根据图片地址得到文件流
  6. 微信小程序navigateBack如何带参数
  7. react中redux的store.js样板文件
  8. 有关DataForm组件的研究_显示多重数据模型集合——Silverlight学习笔记[24]
  9. maven实战之我见一(maven初识)
  10. wps如何自己制作流程图_WPS如何绘制流程图? WPS绘图流程图详细教程
  11. CityMaker学习教程07 示例代码的使用CSharp
  12. 基因组选择中如何清洗基因组数据
  13. java 利用httpclient绕过百度验证登录爬取百度指数
  14. AI时代-人工智能入学指南 - 迪哥有点愁
  15. Java(35):Java Base64编码和解码工具类
  16. FreeBSD安装vmtools波折
  17. unity沙子堆积_unity游戏逼真沙子和白雪粒子特效渲染创建插件Basic Sand amp; Snow 1.0 - 素材巷...
  18. autofac 作用域_.Net Core3.1下使用Autofac实现依赖注入
  19. BIOS知识枝桠——ASL语言
  20. 分布式事务解决方案之RabbitMQ

热门文章

  1. [原创] Android Automotive 车载应用对驾驶模式(Safe Drive Mode)适配的几种方法
  2. 基于变增益自抗扰技术的机器人轨迹跟踪控制方法
  3. 天玑920相当于骁龙什么
  4. 边缘触控并非唯一 手机新交互方式盘点
  5. 华南区高校第四届“CDA杯”数据分析大赛圆满结束
  6. 网站视频播放慢的解决方案
  7. 微信公众号支付JSAPI 详细记录
  8. MySql数据库函数集
  9. excel怎么把竖排变成横排_Word2013竖排文字怎么排版
  10. 在linux环境中利用efibootmgr管理efi启动项[添加、删除、改变顺序]