Обеспечение доступности DLL для всех программ Windows (win10 pro x64)

390
ilya

Из-за (не относящихся к этому вопросу) ограничений реализации OpenGL в Virtualbox (доступна только версия OpenGL 1.1, но мне нужна как минимум версия 2.0), я решил использовать программную реализацию в форме DLL (называемой opengl32.dll ), которая может можно скачать здесь: ftp://ftp.blender.org/sergey/softwaregl/

Один из способов сделать это - поместить файл opengl32.dll прямо в тот же каталог, что и исполняемый файл.

Мой вопрос: каков наилучший способ сделать эту программную реализацию доступной для всех программ, не копируя файлы DLL вокруг.

Важное замечание: всем 32- битным приложениям нужен файл opengl32.dll из каталога / win32 / этого FTP-сервера, в то время как всем 64- битным приложениям нужен файл opengl32.dll (то же имя, но это другой файл!) Из каталог / win64 / . Таким образом, если у меня есть одно 32-битное и одно 64-битное приложение в одном и том же каталоге на моем компьютере, решение поместить DLL в одну и ту же папку не работает: невозможно иметь два разных файла с одинаковым именем в одном и том же каталоге. каталог.

1
См. Https://stackoverflow.com/questions/949959/why-do-64-bit-dlls-go-to-system32-and-32-bit-dlls-to-syswow64-on-64-bit-windows igagis 5 лет назад 0

3 ответа на вопрос

1
harrymc

Обычное решение состоит в том, чтобы иметь две подпапки как это:

Installation folder |--- Win32 DLL |--- Win64 DLL 

Программа .exeнаходится в основной папке, но не вызывается напрямую. Вместо этого он запускается через .batфайл, который проверяет, является ли Windows 32- или 64-битной, и запускается .exeв контексте соответствующей подпапки. Поиск DLL выполняется в нескольких папках, одна из которых является текущей папкой.

Посмотрите файл post batch для проверки 64-битной или 32-битной ОС .

Если вас беспокоит, что .batфайл выглядит как черное квадратное окно, вы можете запустить его как скрытый, как описано в посте. Запустите пакетный файл полностью скрытым способом . Программа с графическим интерфейсом, которая запускается из такого скрытого пакетного файла, сама по себе не будет скрыта.

Что вы подразумеваете под словами «запустить .exe ** в контексте ** подпапки»? ilya 5 лет назад 0
Я имею в виду концептуально сделать `cd Win32DLL` или` cd Win64DLL` перед выполнением `.. \ prog.exe`. Пути должны быть написаны более явно, чем эта короткая версия. harrymc 5 лет назад 0
1
igagis

Вы должны поставить 64bit dllк c:\Windows\System32и ваш 32 бит dllв c:\Windows\SysWOW64.

Обратите внимание, что в Windows 10 оригинальные OpenGL32.dllфайлы доступны только TrustedInstallerпользователю. Таким образом, чтобы заменить их, вы должны сменить владельца этих файлов на Administrator. Для меня это было невозможно сделать с помощью любого пользовательского интерфейса, но подход с использованием командной строки работал. Для этого запустите от имени Command Promptадминистратора. Затем используйте следующие команды для удаления оригинальных OpenGL32.dllфайлов:

takeown /F C:\Windows\System32\OpenGL32.dll /A icacls C:\Windows\System32\OpenGL32.dll /T /grant administrators:F move C:\Windows\System32\OpenGL32.dll C:\Windows\System32\OpenGL32.dll.orig

То же самое для C:\Windows\SysWOW64каталога.

После этого просто скопируйте свой собственный OpenGL32.dllв эти места в качестве администратора.

0
MSalters

Использование KnownDLLмеханизма может помочь. Известные DLL обходят поиск в файловой системе и вместо этого загружаются из одного фиксированного каталога. Удобно, что есть один каталог KnownDLL для 64-битных процессов и один каталог KnownDLL32 для 32-битных процессов.

не могли бы вы уточнить немного? Поиск в Google по "Knowndll" не очень помогает, увы. ilya 5 лет назад 0
@ilya: Короче говоря, «KnownDLL» - это список имен DLL, кэшируемых Windows, поэтому при загрузке им не нужно размещать их на диске. Название происходит от ключа реестра, в котором они перечислены. См. Https://stackoverflow.com/questions/3555749/microsoft-known-dll для получения подробной информации. Добавив `opengl32.dll` в этот список, вы можете указать Windows, где найти` opengl32.dll` на диске. MSalters 5 лет назад 0