32位程序移植64位经验

最近移植了一个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

posted @ 2016-10-10 21:48  findumars  Views(1828)  Comments(0Edit  收藏  举报