如果Windows应用程序在系统PATH变量中位于两个单独的路径中,那么Windows应用程序通常是否能够区分具有相同名称的两个DLL,一个是32位,一个是64位?
特别是现在,我有FreeImage的32位和64位DLL,它们分别位于两个单独的文件夹free_image_path\dist32
和free_image_path\dist64
中,我添加到了系统路径。但是,使用它们构建的应用程序也找不到,我想知道这是因为有两个具有相同名称的DLL并且它们无法区分它们。
我还尝试将32位和64位DLL分别放在windows \ system和windows \ SySWoW64文件夹中,这适用于32位应用程序,但不适用于64位应用程序。
感谢。
答案 0 :(得分:8)
Windows可以判断是否为32位或64位平台编译了给定的DLL,但这对您描述的情况没有帮助。只要在系统路径中找到符合DLL导入的文件名要求的DLL,应用程序进程的DLL加载程序就会停止查找。匹配代码 DLL没有其他资格。 (如评论中所述,非代码资源DLL是一个不同的故事。我怀疑资源DLL不是由核心程序加载器加载,而是由具有不同规则和目标的资源管理器加载。)
如果路径中的第一个DLL是32位且您的应用程序是32位,则DLL加载将起作用。如果应用程序是64位,它将无法加载DLL并且进程将中止。
如果您希望两个DLL在系统路径上共存,则需要为它们指定唯一的文件名。
答案 1 :(得分:2)
作为将{64} dll放在\windows\system32
中的替代方法以及将{32}放在\windows\syswow64
中的替代方法,我发现如果将32位数据放在子目录中它也可以工作\Program Files (x86)
的{{1}}和相应的\Program Files
子目录中的64位,其中包含这两个子目录。