MFC中WinHelp函数在64位系统上重载失败的原因
2011-05-25 15:59
274 查看
MFC中,键盘上的F1加速键会直接和基类的WinHelp函数关联,从而按下F1打开和应用同名的HLP文件。如果我们的帮助文件格式是其它格式,如chm,或者文件的名字不一样,则需要重载WinHelp函数,在函数内部修改m_pszHelpFilePath变量。
如果在Visual Studio中采用wizard重载WinHelp函数,它的格式如下:
virtual void WinHelp(DWORD dwData, UINT nCmd = HELP_CONTEXT);
上述重载函数在32位系统上运行没有任何问题,当代码编译成x64版本运行在64位系统上后,就出现了问题,不能进入该重载函数
。开始以为是64位系统中与F1关联的WinHelp为子窗口或者父窗口的,由于我的界面由property sheet构成,所以猜想是否是64位下,关联到了单个sheet的WinHelp。经过同事帮助发现是重载失败
,原因如下:
最新的WinHelp函数原型已经有了变化,该原型可以兼容64位及32位,估计是微软后期添加的函数,格式如下:
virtual void WinHelp( DWORD_PTR
dwData, UINT nCmd = HELP_CONTEXT );
该API可以在msdn上轻易找到,可以看到,主要的变动是DWORD_PTR这个类型,这个类型在32位系统上长度为32bits,64位系统上则为64bits。
于是乎,按照这个改动,将重载函数的参数类型做以修改就可以了。
如果在Visual Studio中采用wizard重载WinHelp函数,它的格式如下:
virtual void WinHelp(DWORD dwData, UINT nCmd = HELP_CONTEXT);
上述重载函数在32位系统上运行没有任何问题,当代码编译成x64版本运行在64位系统上后,就出现了问题,不能进入该重载函数
。开始以为是64位系统中与F1关联的WinHelp为子窗口或者父窗口的,由于我的界面由property sheet构成,所以猜想是否是64位下,关联到了单个sheet的WinHelp。经过同事帮助发现是重载失败
,原因如下:
最新的WinHelp函数原型已经有了变化,该原型可以兼容64位及32位,估计是微软后期添加的函数,格式如下:
virtual void WinHelp( DWORD_PTR
dwData, UINT nCmd = HELP_CONTEXT );
该API可以在msdn上轻易找到,可以看到,主要的变动是DWORD_PTR这个类型,这个类型在32位系统上长度为32bits,64位系统上则为64bits。
于是乎,按照这个改动,将重载函数的参数类型做以修改就可以了。
相关文章推荐
- win7 系统64位 在ivisual studio 2010下运行mfc单文档项目时生成失败出现“fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”的解决办法
- 64位系统上设置编译平台为x86的VS2008项目升级到VS2010后编译失败的原因和解决办法
- 64位Win7下Cygwin32 gdb调试时程序文件系统访问函数失败
- win64位系统-----PL\SQL连接Oracle数据库的注意事项
- Winio64在64位系统中初始化失败问题
- 64位windows7下使用CopyFile()函数复制文件到系统目录下不成功问题
- 如何重载MFC对话框的OnInitDialog()函数
- MFC界面包装类(多线程时成员函数调用的断言失败)
- Windows 64位系统下32位进程调用64位进程中的函数
- ERP系统实施失败的原因
- 64位系统下libmemcached在GCC 4.7.1 下编译失败的解决方案
- win系统注册缺少的库 32位系统 64位系统
- 求助,C++中为什么有些函数只能用成员函数重载,而有些函数则只能用友元函数重载,其本质原因是什么?
- ubi 文件系统加载失败原因记录
- zhphp frmaework (六) help帮助函数包,以及系统应用函数包
- 重载决策失败,原因是没有可访问的“New”能够不经收缩转换即可被调用
- Win7 & Win 8系统更新失败的解决
- 手工修复Win 7下彩影ARP防火墙驱动程序(适用于32/64位系统)
- Linux 系统更新命令行模式,出错原因,软件更新器更新失败,系统提示已为最新版本,问题如何解决
- 系统调用system失败的原因分析