32位程序移植64位经验

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于32位程序移植64位经验的主要内容,如果未能解决你的问题,请参考以下文章

将 32 位 C++ 代码移植到 64 位 - 值得吗?为啥?

移植 - 共享内存 x32 和 x64 进程

VS2008的32位的程序如何移植到64位的系统,具体操作上的问题

32位平台代码向64位平台移植

Qt开发经验小技巧261-265

64 位应用程序和内联汇编