1. 准备工作
为了保证升级过程顺利进行,需要一些资源。
1.1 目标平台
为了运行和测试64位的软件,需要相应的支撑平台。
硬件:需要支持64位运算的处理器如amd64构架或Intel 64构架。
操作系统:64位操作系统,这里只讨论windows平台,微软从windows xp以后所有的操作系统都有相应的64位版本,本文以Windows XP 64bit Edition为例。目标操作系统可以安装在物理机器上,也可以使用虚拟机安装,当然硬件都必须支持64位才可以,另使用虚拟机安装64位系统时,需要处理器支持虚拟化技术。
运行时库:需要64位运行时库,这可以从编译环境获得。
1.2 编译器
这里需要到目标平台的编译器,即x64编译器,编译器本身不一定是64位的;除编译器外,对应的开发库和头文件也是必须的,为了方便,最好使用集成开发环境,如visual Studio,自vs2005后开始有64位编译器(vs本身是32位的),但默认不会安装,如果已安装vs2008(或2005/2010),则通过重新运行安装程序添加删除功能,添加x64编译器即可,如下图:
2. 配置x64编译选项
2.1 增加x64目标平台
打开需要移植的项目,在解决方案管理器中,项目节点单击右键选择属性,打开项目属性对话框,并打开配置管理器,如下图:
在“活动解决方案平台”下拉列表中选择新建,打开“新建解决方案平台”对话框:
在新的平台中选择x64,并从现有win32平台复制且创建新的项目平台,单击确定,即完成平台的创建。
2.2 配置x64编译属性
在上述新建立的平台配置中,为了简化配置工作,我们是从现有Win32平台配置拷贝而来,所以在建立完成后,我们仍需要对新建的编译配置做部分修改,在创建新的目标平台前,软件有两个编译配置debug和release,均为win32平台的编译配置;在建立新的平台后,就会组合出新的编译配置,即针对x64的debug和release版本,如下图:
所以修改x64编译属性时,就需要同时修改对应的debug和release配置了(如果之前还有其他编译配置,此处也要对应修改),下面以Debug|x64为例说明配置的修改:
预处理器:将宏WIN32改为_WIN64,如下图:
第三方库目录指向x64版本库目录,当软件使用了vs库以外的第三方库时,需要相应的库的x64版本,包括导入库(动态链接时):
3. 编译调试
通过2已经建立起x64平台的编译配置,接下来通过编译可以看到当前代码在新的平台中的错误,但为了不影响之前平台的版本,我们不宜贸然修改之前的代码,建议采取之下方式,将x64和win32代码隔离:
#ifdef _WIN64
//x64代码
…
#else
//win32代码
…
#endif
当然,如果是因为类型长度的变化导致的错误,可以使用VS头文件中定义的通用的类型来消除这种错误。
4. 移植过程中可能遇到的问题
在新的平台配置下编译时,难免会出现一些错误,其中有些错误是由于内部类型的变化导致的(如截断,使用int表示指针等等),这种平台差异导致的语法错误可以通过修改相关变量定义很快修正,但有些依赖性问题可能需要更多方面的参与才能得到较好的解决,下面列出一些常见的问题,及其解决办法。
4.1 找不到第三方库
这中情况可能发生在链接阶段,也可能发生在运行阶段,都是链接错误,其原因是工程或程序依赖的库文件没找到,或找到的不是目标平台版本的库。
解决办法:检查工程选项中的链接选项,确保附加库参数指向正确的路径;找到工程所依赖的库文件的x64版本(包括导入库),将其放到指定目录中;
如果可以获得所需要的库的源码,则可以编译得到其x64库(这是个递归过程),否则需要寻求该库的提供者,索取x64版本的库,如果这两条路都走不通,则要么自己实现软件中所使用的库的特定功能,要么将对应的库换成另一种支持x64平台的具有相同功能的库。
4.2 软件某些界面无法显示
这都是运行时错误,这种情况可能是该界面使用的控件没有安装,可以通过Depends(x64版本的)工具查看所缺失的控件,解决方法和4.1相同。
需要注意的是有些常用控件到目前为止还没有x64版本,如微软的msflexgrid控件没有x64版本的,以及同样功能的vsflexgrid也不支持x64平台(至2010年底时),如果你的界面中使用了这些控件而又不得不移植到x64平台时,你可能需要调整界面了,使用其他控件代替,或联系本文作者(仅限于flexgrid控件)。
4.3 Access数据库
如果软件中使用了access数据库,在x64版本的软件必须使用x64版本的access数据库驱动程序,很遗憾,微软似乎并不打算提供x64版本的access数据库驱动程序,同样的,您需要采取其他措施绕过这个难点,这里提供两个思路:
a. 将数据访问部分隔离到单独程序中,此程序使用win32版本,然后主程序的进程通过ipc与数据库访问进程通信获取数据,这样会影响性能,慎用。
b. 使用其他支持x64平台的数据库,同样可能需要调整数据库访问部分代码,可能会增加软件成本。
4.4 X64准则
前面所提到的3个问题都是违法一下“准则”所导致的,所以在x64软件运行失败而对应的win32版本运行良好时,请使用下面的准则,检查是否有违背的地方。
同一个进程空间只能运行一个平台的代码,win32进程只能运行32位代码,x64进程空间只能运行x64代码。
这就决定了x64程序所依赖的所有模块都必须是x64版本的,才能正常运行。
5. 有用的小工具
5.1 任务管理器
由于在x64平台上,既可以运行win32程序(通过WOW模拟器),也可以运行x64程序,通过x64操作系统的任务管理器,区分当前运行的软件是x64版本还是win32版本:
上图中,可以看到同时运行了两个扫雷程序,其中一个是win32版本,另一个是x64版本,可以看到,任务管理器通过进程名对二者加以区分,凡是32位程序,其进程名后都以“*32”标记,而x64程序的进程名则正常。
5.2 Dependency Walker
Dependency Walker是开发中常用的工具,用于查看程