Могут ли Windows различать 32-битные и 64-битные библиотеки DLL? - PullRequest
7 голосов
/ 09 июня 2011

Должны ли приложения Windows вообще иметь возможность различать две библиотеки DLL с одинаковыми именами, одна из которых является 32-разрядной, а другая - 64-разрядной, если они находятся в двух разных путях в системной переменной PATH?

В частности, сейчас у меня есть 32-битные и 64-битные библиотеки DLL для FreeImage, и они находятся в двух отдельных папках free_image_path\dist32 и free_image_path\dist64, которые я добавил в системную переменную PATH. Однако приложение, созданное для их использования, тоже не может найти, и мне интересно, если это так, потому что есть две библиотеки DLL с одинаковыми именами, и они не могут их различить.

Я также попытался поместить 32-разрядные и 64-разрядные библиотеки DLL в папки windows \ system и windows \ SySWoW64 соответственно, и это работало для 32-разрядного приложения, но не для 64-разрядного.

Спасибо.

Ответы [ 2 ]

8 голосов
/ 09 июня 2011

Windows может определить, скомпилирована ли данная DLL для 32-битных или 64-битных платформ, но это не поможет в описываемой вами ситуации. Загрузчик DLL для вашего процесса приложения перестанет искать, как только он найдет в системном пути библиотеку DLL, которая соответствует требованиям имя файла для импорта DLL. Других квалификаций для соответствия DLL-библиотекам code нет. (Как отмечено в комментариях, библиотеки ресурсов, не относящиеся к коду, - это отдельная история. Я подозреваю, что библиотеки ресурсов загружаются не основным загрузчиком программ, а менеджером ресурсов с другими правилами и целями.)

Если первая DLL в пути - 32-разрядная, а ваше приложение - 32-разрядная, загрузка DLL будет работать. Если приложение 64-разрядное, оно не сможет загрузить DLL, и процесс будет прерван.

Если вы хотите, чтобы две DLL-библиотеки сосуществовали по системному пути, вам нужно дать им уникальные имена файлов.

2 голосов
/ 01 декабря 2011

В качестве альтернативы помещению 64-битной dll в \windows\system32 и 32-битной в \windows\syswow64, я обнаружил, что это также работает, если вы поместите 32-битную в подкаталог \Program Files (x86)и 64-битный в соответствующем подкаталоге \Program Files, причем оба эти подкаталога включены в PATH.

...