自从操纵系统升级到64位以后,就要不停的需要面对32位、64位的问题。相信有很多人并不是很清楚32位措施与64位措施的区别,以及Program Files (x86),Program Files的区别。同时,对付措施的dll文件应该放到System32文件夹,还是SysWow64,大部分人做的决定是,32位措施放到System32,64位措施放到SysWow64。是不是这样呢,那么今天就由我身边产生的一个案例来详细的说明一下。
dll文件不匹配导致数据库无法启动前段时间,数据库做了一些成果上的改造,于是用VS2010编译检出了一个版本,供测试部测试。测试部拿到数据库后,通过批措置惩罚惩罚将数据库措施,注册为处事。虽然执行的是批措置惩罚惩罚,实际上注册处事的过程,是通过运行数据库措施,并给其传入命令行参数来完成的,详情请看这篇文章玩转Windows处事系列——Debug、Release版本的注册和卸载,及其道理。
通过批措置惩罚惩罚运行措施后,呈现如下问题:
呈现这种问题,测试部不淡定了,叫我去看。我又试着运行了一下措施,依然呈现这个问题。“可是在我的机器上运行的挺好的啊”,这是我说的第一句话,相信很多人看了这句话就会心的笑了。
有问题就是有问题,既然我的机器上可以正常运行,那么测试机为什么不行呢,首先要查找原因。
数据库是用VS2010编译的,那么在其他机器上运行,就需要运行的操纵系统中以及安置了VS2010的运行时,否则就会因为缺少措施运行所必需的dll文件而无法正常运行。我想应该是这个原因,但又一想,如果没有装运行时的话,会提示缺少msvcr100.dll、msvcp100.dll等文件,上图中的问题显然不是缺少dll问题。问题有点庞大,为了简单,先试着安置运行时,看能不能解决吧。
将VS2010的x86和x64 Runtime安置包全装了一遍。再运行措施,依然是这个夺目的错误。
虽然安置运行时没有解决这个问题,但按照经验判断,要么是缺少dll文件,要么就是dll文件版本出了问题。那么,接下来就是想步伐证明这个料想。
通过Dependency Walker检测数据库措施,所有依赖的dll文件都存在,没有发明什么问题。然后通过Windows Sysinternals中的ListDLLs工具检测当前运行的进程已经加载的dll文件,从列表中看到msvcr100.dll没有加载,预计就是这个dll文件出了问题。从我的机器上找到这个文件,替换了测试机上的msvcr100.dll文件后,数据库就正常运行了。
本来,刚刚启动数据库的时候,提示找不到msvcr100.dll文件,测试的同事就从其他的XP系统的机器上找了这个文件,并分袂放入到System32和SysWow64中,于是就导致了上图中的这个问题。
由于XP系统是32位的,所以找到的msvcr100.dll文件也是32位,当把这个32位措施放到System32文件夹后,启动64位数据库,就会加载这个32位dll,由于64位措施只能加载64位dll,所以当措施测验考试加载32位dll时,就会报错了。
究竟是System32还是SysWow64Win7、Server2008等64位系统出来以后,为了兼容32位措施,所以给与了Wow64方案,在系统文件夹中,可以看到一个System32文件夹,和一个SysWow64文件夹。虽然这个方案对付措施来说,可以很便利的兼容32位措施,但是对付一般用户来说,想辨别System32和SysWow64那就有点困难了,因为名字太有迷惑性了。
至于微软为什么给与Wow64方案,我就不细说了,感兴趣的伴侣可以看这篇文章:什么是SysWow64。这篇文章详细的介绍了Wow64技术,以及64位系统兼容32位措施的情况。
最后,我们可以知道:
SysWow64文件夹,是64位Windows,用来存放32位Windows系统文件的处所,而System32文件夹,是用来存放64位措施文件的处所。
当32位措施加载System32文件夹中的dll时,操纵系统会自动映射到SysWow64文件夹中的对应的文件。
看到这些,你必然会认为你真正的大白了System32和SysWow64的区别,我也一样,我以为我真的懂了,但是真的懂了吗,是真懂了吗?
无论怎样还是请你对峙看完。
区分dll文件32位64位的措施让我倍感迷惑上面说到的数据库无法启动的这种情况,已经遇到了不止一次了。每次遇到这种问题,我都想能不能有个工具可以查抄System32和SysWow64文件夹中的dll措施是不是对应的64位和32位措施。据我所知只有dumpbin可以检察一个dll文件是32位还是64位,但它明显不是我想要的工具,因为每次只能检察一个文件。
好吧,本身动手,人给家足,既然没有这种工具,那就来写一个吧,好在判断dll文件是32位还是64位也不是很难。
Windows系统下,exe、dll文件都可以称为PE文件,他们有不异的文件格局,称为PE文件格局。
PE文件的第一个部分是IMAGE_DOS_HEADER,巨细为64B,对付查抄32位64位来说,有一个重要的成员e_lfanew,这个成员的值为IMAGE_NT_HEADERS的偏移。
IMAGE_DOS_HEADER的界说如下: