发布时间:2010-2-12 11:49
分类名称:Private
有一些API只有在64位平台上才有,可通过判断有没有这些函数来判断平台,如Wow64DisableWow64FsRedirection。
在64位windows上,某些数据类型的长度改变了:
数据类型 | 32位长度 | 64位长度 |
---|---|---|
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4 |
long | 4 | 8 |
WORD | 2 | 2 |
DWORD | 4 | 4 |
LONG | 4 | 4 |
void* | 4 | 8 |
因为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根据exe和dll的manifest里的签名(动态库名称和版本号等),去系统WINDOWS\WinSxS下找相应的动态库.这样可以做到同一 个动态库的不同版本在系统中共存.而用户的exe,dll的manifest里记录了他本身依赖的那些版本的动态库,避免了dll hell.
这样就造成了安装这些运行时库时,不能像vc6时那样把msvcrt等简单的拷贝即可,而是需要向系统中注册其签名,以便客户应用程序和动态库能够顺利的 找到它.vc.net提供了redistribute包,供应用软件开发商重新发布.安装时一定要注意选用正确的版本安装,否则程序不能正确运行.