Introduction to 64bit application on windows

发布时间:2010-2-12 11:49
分类名称:Private


运行时判断平台

有一些API只有在64位平台上才有,可通过判断有没有这些函数来判断平台,如Wow64DisableWow64FsRedirection。

编译时特性

在64位windows上,某些数据类型的长度改变了:

数据类型32位长度64位长度
char11
short22
int44
long48
WORD22
DWORD44
LONG44
void*48

运行时特性

因为64位平台,既能运行64位应用程序,也能运行32位应用程序,所以在64位平台上,32位和64位中间件要同时安装。 在64位平台上,32位应用程序是运行在32位虚拟机里的,称为Wow64(win32 on win64)。因为64位应用程序只能调用64位动态库,32位程序只能调用32位动态库,所以32位动态库和64位动态库要分开存放,有同样问题的还有 注册表。

文件系统

动态库一般放在system32下,不管32位应用程序还是64位应用程序都从这里找系统动态库。而我们上面说了64位动态库和32位动态库需要分开存 放,64位程序的本地动态库还是存放于system32下,同时Wow64虚拟机将32位动态库放到windows\syswow64目录下。有的应用程 序将system32路径硬编码入程序,为解决兼容问题,Wow64会自动对文件系统和注册表进行映射,32位应用程序访问system32会被自动重定 向到windows\syswow64下。

注册表

与文件系统类似,软件的配置一般放到HKEY_LOCAL_MACHINE\SOFTWARE下,64位平台的32位软件配置信息被虚拟机放在下,运行时会自动进行映射。

有一类注册表比较特殊:COM的进程外组件由于是.exe的可执行程序,而不像进程内组件那样是.dll。所以对于这种控件,虚拟机实现了分别叫做”映 射”和“共享”的机制。他们的区别是一个需要在两种不同的view(32/64)间拷贝,以保持一致,另一种则是两种view映射到一个物理节点,当然这 些对于上层是透明的。我们碰到过这种问题,在测试vista64时,我们发现在有的机器上,不管32位IE还是64位IE总是调用32位的csp,后来查 明在这些机器上,IE的申请证书控件是进程外组件,一个32位可执行程序,会调用到32位csp。而在另外一些机器上,IE的申请证书控件使用进城内组 件,分别调用32位和64位csp。

采用上述两种机制的除COM外还有例如HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography \Calais\SmartCards注册表项,智能卡在系统中只注册为一份。

运行时库安装

使用vc.net编译64位应用程序,需要用到vc(7 or 8 or 9)的运行时库.为解决dll hell问题,使用这些运行时库需要验证其manifest.manifest里最重要的是dependence.里面记录了可执行程序(动态库)依赖的 动态库的版本.这样需要同一个动态库的不同版本共存,微软使用了一种叫做SxS(side by side)技术来解决此问题.

SxS

SxS根据exe和dll的manifest里的签名(动态库名称和版本号等),去系统WINDOWS\WinSxS下找相应的动态库.这样可以做到同一 个动态库的不同版本在系统中共存.而用户的exe,dll的manifest里记录了他本身依赖的那些版本的动态库,避免了dll hell.

这样就造成了安装这些运行时库时,不能像vc6时那样把msvcrt等简单的拷贝即可,而是需要向系统中注册其签名,以便客户应用程序和动态库能够顺利的 找到它.vc.net提供了redistribute包,供应用软件开发商重新发布.安装时一定要注意选用正确的版本安装,否则程序不能正确运行.