为什么我的程序在Vista 64位系统上找不到它的DLL文件?

10

我最近买了一台新笔记本电脑。不幸的是,它带有Vista系统。让它正常工作非常麻烦,因为该计算机有某些硬件组件,而这些组件没有XP驱动程序,所以我无法“升级”到实际可用的操作系统。我已经基本上解决了所有问题,但是有一个特别奇怪的问题让我困惑。

我安装了Delphi并尝试构建一个项目。它编译成功,但无法运行。“此应用程序无法启动,因为找不到sdl.dll文件。”好吧,于是我下载了SDL.dll并将其放在C:\windows\system32文件夹中。(使用的是Vista 64位家庭高级版。虽然这是一个32位的dll文件,但我将其放在了32文件夹中,而不是64文件夹。)

再次点击运行,出现了同样的问题。但为什么呢?那个文件不就在那里吗?而且C:\windows\system32在系统路径中。有人知道为什么它不能链接到DLL吗?

(是的,我知道我可以通过将DLL放在.exe文件相同的文件夹中来解决问题。目前,我正在使用这种方法作为解决方法。但从长远来看,这是一个不好的想法,因为我有几个不同的项目都需要SDL。)

2个回答

28

这不是一个Vista的问题,而是64位Windows的问题:名称为System32实际上是64位系统DLL的存储文件夹,这个名称确实令人困惑。

因此,在任何64位版本的Windows上...

...所有64位系统DLL都位于C:\Windows\System32中。

...所有32位系统DLL都位于C:\Windows\SysWOW64中。

该名称来自于Windows on Windows 64WOW64),它是一个翻译层的名称,允许32位应用程序使用本地64位系统资源。


谢谢,那个起作用了。确实“非常令人困惑”。是谁设置的?!? - Mason Wheeler
2
更糟糕的是,在32位仿真模式下运行(运行任何win32二进制文件),程序中对C:\ Windows \ System32的所有引用都会被静默地重定向以访问C:\ Windows \ SysWOW64。这有时会导致win32 .exes出现奇怪的问题。 - Chris Dodd
因为这个名字,SysWOW64,我一直以为相反,32位的DLL在System32中,64位的在SysWOW64中。很高兴看到你的回复,现在我明白了。要是早几天知道就好了。我知道当我试图运行64位的PHP时,这给我带来了痛苦。 - lkessler

8
雷蒙德·陈最近解释了64位Windows上32位系统目录为什么奇怪的基本原因。该条目的第一段是理解分离32位目录背后原因的关键:

在64位Windows上,32位程序运行在仿真层中...如果32位程序试图查看系统,它将看到一个32位系统。

我认为你需要有单独的目录来保持这些东西的分离和工作。当你考虑到WOW64意味着Windows On Windows 64位时,似乎反直觉的SysWOW64名称更有意义,这就是上面提到的仿真器的名称。

1
不错的文章。"它之所以能够这样运作是因为我们说它能够这样运作。闭嘴,继续写更多代码吧。来,喝杯果汁水吧。" - Mason Wheeler
我正在阅读你链接的文章。它说“因为它在模拟器内部”,但实际上并没有解释DR提到的反向命名行为的原因,并声明与其对抗,不如与系统合作。 - Mason Wheeler
好的,我现在明白你的困惑了。已经编辑答案来解释WOW64。 - Matt Lewis
啊哈,这样就更有意义了。(他们为什么不能这么说呢?):P - Mason Wheeler
这仍然无法解释为什么在win64上将系统目录命名为'system32'而不是'system64',后者更有意义。 - Chris Dodd
他们真的喜欢那种半吊子的解释。 - Fabricio Araujo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接