编译64位程序数据类型转换问题

lucifer2012_NJ 2013-01-21 10:15:58
我的环境是这样的,通过XP+cygwin+VS2008+SDK+DDK等搭建的一个编译环境,环境变量的设置是通过.sh脚本写的,因为最近需要用在64位PC上,用64位浏览器调用原先写的几个控件,在编译其中一个控件的时候,出现了一个类型转换的问题(原先编译成32位程序的时候没有出现过)下面我贴下问题代码:
LRESULT lRes;
SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
报错的是error C2664: SendMessageTimeoutA第七个参数不对,按照提示用reinterpret_cast来进行转换还是不能解决,谁是否有这方面的解决经验?
(编译环境,link工具等都没有问题,环境变量都已经引用64位所需要的库等)
...全文
332 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rlymaths12345 2013-01-22
  • 打赏
  • 举报
回复
很感谢,受用。
lucifer2012_NJ 2013-01-22
  • 打赏
  • 举报
回复
引用 楼主 lucifer2012_NJ 的回复:
我的环境是这样的,通过XP+cygwin+VS2008+SDK+DDK等搭建的一个编译环境,环境变量的设置是通过.sh脚本写的,因为最近需要用在64位PC上,用64位浏览器调用原先写的几个控件,在编译其中一个控件的时候,出现了一个类型转换的问题(原先编译成32位程序的时候没有出现过)下面我贴下问题代码: LRESULT lRes; SendMessageTimeout( hWndChild, ……
error C2664: ▒▒SendMessageTimeoutA▒▒: ▒▒▒ܽ▒▒▒▒▒ 7 ▒ӡ▒DWORD *▒▒ת▒▒Ϊ▒▒PDWORD_PTR▒▒ ▒▒ָ▒▒▒▒▒▒▒▒޹أ▒ת▒▒Ҫ▒▒ reinterpret_cast▒▒C ▒▒ʽת▒▒▒▒▒▒▒▒ʽת▒▒ 还是不行。。。这是错误提示,在cygwin上的显示
ForestDB 2013-01-22
  • 打赏
  • 举报
回复
LRESULT WINAPI SendMessageTimeout( _In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam, _In_ UINT fuFlags, _In_ UINT uTimeout, _Out_opt_ PDWORD_PTR lpdwResult );
lucifer2012_NJ 2013-01-22
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行!
可能大大不知道我编译环境,在未生成可执行文件之前,程序还不好进行调试,编译环境是一个集成环境,不仅仅是基于VS下的,当然,我也仅仅是菜鸟中的菜鸟,谢谢忠告
赵4老师 2013-01-22
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行!
lucifer2012_NJ 2013-01-22
  • 打赏
  • 举报
回复
再将DWORD_PTR强制转换成LRESULT,编译没有出错,但是严谨性我没有考虑进去。
lucifer2012_NJ 2013-01-22
  • 打赏
  • 举报
回复
引用 6 楼 mymtom 的回复:
实际情况就是 SendMessageTimeout只会返回给一个DWORD的值!而楼主需要一个LRESULT值。 在64位的情况下,DWORD是装不下LRESULT值的。 所以楼主需要自己决定, 1. 如果确定楼主需要的LRESULT的取值范围不会超过DWORD的上限的话,可以这样 C/C++ code ? 123456789 LRESULT lRes……
VC中DWORD_PTR和DWORD区别在于,DWORD_PTR的定义是,至少可以确保放得下DWORD,并且确保放得下一个指针,而DWORD的长度是固定的32位,而指针长度跟硬件,系统,编译器有关,那么32位程序的时候,两者就是一回事,64位编译的时候,DWORD_PTR是64位,而DWORD永远是32位,这个应该是问题的关键吧,返回值类型已经不能用DWORD了
lucifer2012_NJ 2013-01-22
  • 打赏
  • 举报
回复
VC中DWORD_PTR和DWORD区别在于,DWORD_PTR的定义是,至少可以确保放得下DWORD,并且确保放得下一个指针,而DWORD的长度是固定的32位,而指针长度跟硬件,系统,编译器有关,那么32位程序的时候,两者就是一回事,64位编译的时候,DWORD_PTR是64位,而DWORD永远是32位。
mymtom 2013-01-22
  • 打赏
  • 举报
回复
实际情况就是 SendMessageTimeout只会返回给一个DWORD的值!而楼主需要一个LRESULT值。 在64位的情况下,DWORD是装不下LRESULT值的。 所以楼主需要自己决定, 1. 如果确定楼主需要的LRESULT的取值范围不会超过DWORD的上限的话,可以这样

LRESULT lRes;
DWORD dwRes;

SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, &dwRes);
lRes = dwRes;

HRESULT hr;
hr = (*pfObjectFromLresult)(lRes, IID_IHTMLDocument, 0, (void**)&spDoc );
2. 否则的话,不能用这种SendMessageTimeout的方法返回处理结果,需要其他的方法!
lucifer2012_NJ 2013-01-22
  • 打赏
  • 举报
回复
引用 4 楼 mymtom 的回复:
试试改成 C/C++ code ? 123 DWORD dwRes; SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, &dwRes);
:(还是一样,只有这种情况不报错
PDWORD_PTR lRes;
SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, reinterpret_cast<PDWORD_PTR>(&lRes) );
但根据MSDN上说的,第七个参数是[out] Pointer to a DWORD that receives the result of the message processing. This value depends on the message that you send. 既然这样说了,那跟DWORD有何区别呢?而且我后面的程序需要使用到这个LRESULT,那该如何是好,将PDWORD_PTR类型转成LRESULT?好像不是很实际
HRESULT hr;
hr = (*pfObjectFromLresult)(lRes, IID_IHTMLDocument, 0, (void**)&spDoc );
mymtom 2013-01-22
  • 打赏
  • 举报
回复
试试改成

DWORD dwRes;
SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, &dwRes);
mymtom 2013-01-21
  • 打赏
  • 举报
回复
LRESULT在64为下增大到64位了,所以DWORD是装不下LRESULT的! 检查一下,是否可以把 LRESULT lRes 换成 DWORD dwRes;

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧