Windows可以区分32位和64位的DLL吗?

7
一般来说,如果32位和64位的两个同名DLL文件在系统PATH变量的不同路径下,Windows应用程序通常应该能够区分它们。具体而言,现在我有FreeImage的32位和64位DLL文件,它们分别位于两个文件夹free_image_path\dist32free_image_path\dist64中,我已将它们都添加到了系统PATH中。然而,构建用于使用它们的应用程序时无法找到任何一个,我想知道是否是因为有两个同名的DLL文件而无法区分它们。我还尝试将32位和64位DLL文件分别放置在windows\system和windows\SySWoW64文件夹中,这对32位应用程序有效,但对64位应用程序无效。谢谢。

6
你说:“把32位和64位的DLL放在windows\system和windows\SySWoW64文件夹中,分别。” [令人困惑的是,这完全相反。] (参见:http://en.wikipedia.org/wiki/WoW64) - Craig Stuntz
啊哈!这可能解释了一些事情。那时我只是随意尝试,因为我最初尝试添加两个新路径,dist32和dist64,但没有成功。我会尝试交换它们。 - SSilk
这个问题也适用于Simple Directmedia Layer (SDL)的动态链接库(DLL);即SDL2.dll。 - user2023370
2个回答

8

Windows可以判断给定的DLL是为32位还是64位平台编译的,但这对你描述的情况没有帮助。应用程序进程的DLL加载器会在找到符合DLL导入的文件名要求的系统路径中的DLL后停止查找。没有其他符合代码DLL的资格条件。(如评论所述,非代码资源DLL是另一回事。我怀疑资源DLL不是由核心程序加载器加载的,而是由具有不同规则和目标的资源管理器加载的。)

如果路径中的第一个DLL是32位的,并且你的应用程序也是32位的,则DLL加载将起作用。如果应用程序是64位的,则它将无法加载DLL,并且进程将终止。

如果您想让两个DLL在系统路径中共存,您需要为它们分配唯一的文件名。


2
很抱歉,但这是不正确的(“它将无法加载DLL”)。这取决于您如何使用DLL。例如,可以将x64 DLL用作x86进程的资源DLL,反之亦然。一旦涉及代码,您在所有其他方面显然都是正确的。 - 0xC0000022L
2
嗯,这是99%的真实。让我们在这个问题上达到100%的准确性,FreeImage是一个库。 - Hans Passant
1
正如Craig在上面的评论中指出的那样,我把DLL文件放错了系统文件夹;我将它们互换了一下位置,现在它可以正常工作了。尽管我的问题更一般地涉及应用程序是否可以仅根据DLL本身区分具有相同名称的DLL,而不是特定路径,但我已经将其标记为答案。 - SSilk
谢谢你们的笔记。我已经更新了答案,使其更具体地针对代码dll,并指出资源dll是一种不同的东西。 - dthorpe
我建议更新这个答案,包括使用\windows\system32\windows\syswow64的方法,因为这可能是最好的解决方案;无论它是否单独回答了问题。 - user2023370

2
作为将64位dll放在\windows\system32中,将32位dll放在\windows\syswow64中的替代方法,我发现如果您将32位dll放在\Program Files (x86)的子目录中,并将64位dll放在相应的\Program Files子目录中,同时将这两个子目录包含在PATH中,也可以正常工作。

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