MFC:将工程从VC6.0工程升级到VS2017所遇到的代码不兼容问题集合
一、errorC2440:消息相应函数类型不能转化
- 问题描述
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 *)”
- 解决方法
- 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
- 问题描述
VS2017编译报错如下:
E0140: 函数调用中的参数太多
C2660: “CWind::HtmlHelpA:”函数不接受4个参数
E0167: "LPCSTR"类型的实参与“UINT”类型的形参不兼容
程序是这么写的:
#include "htmlhelp.h"
...
//通过HtmlHelp调用帮助文件(.chm)的程序代码如下:HtmlHelp(NULL, (LPCSTR)helpFile, HH_DISPLAY_TOPIC, 0);
- 问题分析
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”的成员
- 问题描述
在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();}
- 问题分析
原因是VC++2005及后续VC版本中的CFile没有ReadHuge和WriteHuge成员函数,只在VC6中的CFile才有,不过ReadHuge()函数已被Read()函数代替,WriteHuge()函数已被Write()函数代替。 - 解决方法
遇到这种情况的解决方法把代码中的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所遇到的代码不兼容问题集合相关推荐
- C语言学习1:从下载编译软件开始!DEV-C++、VC6.0、VS2010、VS2017等编译器的下载(Windows系统)
目录 1.前言 2.安装配置环境(可忽略) 3.DEV-C++ 的安装 4.VC6.0的安装 5.其他编译器的下载与安装 1.前言: 学会使用编译器是学习C语言过程中不可或缺的一部分.笔者在此列举了 ...
- VC6.0工程设置介绍
<script src="win.js" type="text/javascript"></script> 打开或新建一个包 含至少一个 ...
- MFC界面库BCGControlBar v33.0 - 全新升级Ribbon Bar、工具栏等
亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v33.0正式发布!此版本包括对每个显示器 DPI ...
- VC项目配置基础 (VC6.0 和VC2005)
转载:http://blog.csdn.net/jwcoffee/article/details/5826981 一.预处理宏 1. 通用宏 VC6.0 中: Project Setting à C/ ...
- VC6.0 project settings
VC6.0project settings(VC6.0工程设置介绍) 打开或新建一个包含至少一个工程的Workspace后,VC6的Project菜单中的"Settings-"命令 ...
- 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. ...
- VC6.0实现网络编程弹出一个消息框
代码如下: #include <windows.h> INT WINAPI wWinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPWSTR IpCm ...
- VC6.0的一个编译错误:fatal error C1001: INTERNAL COMPILER ERROR。
最近在编译一个VC6.0工程(开发环境:win2000+VS6.0+Sp6),在加入预编译头后出现了下面的编译错误提示: c:/program files/microsoft visual studi ...
- 在VC6.0中创建工程并输入源代码
为了把程序代码输入而交给计算机,需要使用VC 6.0的编辑器来完成.如前所述,首先要创建工程以及工程工作区,而后才能输入具体程序完成所谓的"编辑"工作(注意,该步工作在四步骤中最繁 ...
最新文章
- miniui 加载文件时会做的一些事情
- Hive的基本操作-自定义函数
- Linux 下使用Java连接 mysql
- Node — 第八天 (大事件项目接口实现二)
- 根据图片地址得到文件流
- 微信小程序navigateBack如何带参数
- react中redux的store.js样板文件
- 有关DataForm组件的研究_显示多重数据模型集合——Silverlight学习笔记[24]
- maven实战之我见一(maven初识)
- wps如何自己制作流程图_WPS如何绘制流程图? WPS绘图流程图详细教程
- CityMaker学习教程07 示例代码的使用CSharp
- 基因组选择中如何清洗基因组数据
- java 利用httpclient绕过百度验证登录爬取百度指数
- AI时代-人工智能入学指南 - 迪哥有点愁
- Java(35):Java Base64编码和解码工具类
- FreeBSD安装vmtools波折
- unity沙子堆积_unity游戏逼真沙子和白雪粒子特效渲染创建插件Basic Sand amp; Snow 1.0 - 素材巷...
- autofac 作用域_.Net Core3.1下使用Autofac实现依赖注入
- BIOS知识枝桠——ASL语言
- 分布式事务解决方案之RabbitMQ
热门文章
- [原创] Android Automotive 车载应用对驾驶模式(Safe Drive Mode)适配的几种方法
- 基于变增益自抗扰技术的机器人轨迹跟踪控制方法
- 天玑920相当于骁龙什么
- 边缘触控并非唯一 手机新交互方式盘点
- 华南区高校第四届“CDA杯”数据分析大赛圆满结束
- 网站视频播放慢的解决方案
- 微信公众号支付JSAPI 详细记录
- MySql数据库函数集
- excel怎么把竖排变成横排_Word2013竖排文字怎么排版
- 在linux环境中利用efibootmgr管理efi启动项[添加、删除、改变顺序]