首页 > 其他 > 详细

32位程序移植64位经验

时间:2016-10-10 23:28:43      阅读:229      评论:0      收藏:0      [点我收藏+]

最近移植了一个32位程序到64位,原本以为简单的事,折腾了好几天,现在记录下来过程,供有相关问题的人参考;
程序是一个输入法,源代码来自盒子 技术分享http://www.2ccc.com/article.asp?articleid=2850,再此感谢刘麻子大侠,输入法大量的使用了windows定义的结构体或记录类型,涉及的数据类型很多,在32到64转换的过程中参考了技术分享http://blog.csdn.net/hpjx1987/article/details/51453586,首先感谢作者共享知识,但这里有一点在berlin10.1下亲测有争议,文中说用SetWindowLongPtr/GetWindowLongPtr替换SetWindowLong/GetWindowLong,其实不用,看一下SetWindowLong/GetWindowLong的源码实现就会发现delphi已经做好了转换
function GetWindowLong(hWnd: HWND; nIndex: Integer): NativeInt;
begin
  Result := GetWindowLongPtr(hWnd, nIndex);
end;
同样,参数也不用特殊处理,保证参数的类型正确就行
另外我在转64位的过程中发现几点注意事项共享给大家:
1.消息发送时的WPARAM和LPARAM类型大小转64位时,如果使用HiWord和LoWord组装的要注意修改;
2.如果你原来的代码中有用于存放句柄的参数,类型最好是改成THandle,这样转64时不需要修改,如果是integer或DWord的,转64时需要调整,可以改为NativeInt或NativeUInt;
3.指针的大小64位是8bytes,真的是8bytes,对于原来使用integer存放指针值的要注意修改,增加或移动指针时注意和对应的数据结构一致(目前没有发现如何移动小于指针大小的方法);
4.对于使用双倍大小的对象处理2个单个对象的方式时,最好仔细检查下64位类型下是不是仍然是双倍关系,在必要时可以换用FillChar来处理;
5.GlobalAlloc和GlobalFree并不需要换用HeapAlloc(至少目前没发现有问题);
最后展示下自己做的输入法,有做输入法的朋友可以一起交流。

http://bbs.2ccc.com/topic.asp?topicid=516683

32位程序移植64位经验

原文:http://www.cnblogs.com/findumars/p/5947423.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!