Обеспечение доступности DLL для всех программ Windows (win10 pro x64)
441
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 в одну и ту же папку не работает: невозможно иметь два разных файла с одинаковым именем в одном и том же каталоге. каталог.
См. Https://stackoverflow.com/questions/949959/why-do-64-bit-dlls-go-to-system32-and-32-bit-dlls-to-syswow64-on-64-bit-windows
igagis 6 лет назад
0
3 ответа на вопрос
1
harrymc
Обычное решение состоит в том, чтобы иметь две подпапки как это:
Installation folder |--- Win32 DLL |--- Win64 DLL
Программа .exeнаходится в основной папке, но не вызывается напрямую. Вместо этого он запускается через .batфайл, который проверяет, является ли Windows 32- или 64-битной, и запускается .exeв контексте соответствующей подпапки. Поиск DLL выполняется в нескольких папках, одна из которых является текущей папкой.
Если вас беспокоит, что .batфайл выглядит как черное квадратное окно, вы можете запустить его как скрытый, как описано в посте. Запустите пакетный файл полностью скрытым способом . Программа с графическим интерфейсом, которая запускается из такого скрытого пакетного файла, сама по себе не будет скрыта.
Что вы подразумеваете под словами «запустить .exe ** в контексте ** подпапки»?
ilya 6 лет назад
0
Я имею в виду концептуально сделать `cd Win32DLL` или` cd Win64DLL` перед выполнением `.. \ prog.exe`. Пути должны быть написаны более явно, чем эта короткая версия.
harrymc 6 лет назад
0
1
igagis
Вы должны поставить 64bit dllк c:\Windows\System32и ваш 32 бит dllв c:\Windows\SysWOW64.
Обратите внимание, что в Windows 10 оригинальные OpenGL32.dllфайлы доступны только TrustedInstallerпользователю. Таким образом, чтобы заменить их, вы должны сменить владельца этих файлов на Administrator. Для меня это было невозможно сделать с помощью любого пользовательского интерфейса, но подход с использованием командной строки работал. Для этого запустите от имени Command Promptадминистратора. Затем используйте следующие команды для удаления оригинальных OpenGL32.dllфайлов:
После этого просто скопируйте свой собственный OpenGL32.dllв эти места в качестве администратора.
0
MSalters
Использование KnownDLLмеханизма может помочь. Известные DLL обходят поиск в файловой системе и вместо этого загружаются из одного фиксированного каталога. Удобно, что есть один каталог KnownDLL для 64-битных процессов и один каталог KnownDLL32 для 32-битных процессов.
не могли бы вы уточнить немного? Поиск в Google по "Knowndll" не очень помогает, увы.
ilya 6 лет назад
0
@ilya: Короче говоря, «KnownDLL» - это список имен DLL, кэшируемых Windows, поэтому при загрузке им не нужно размещать их на диске. Название происходит от ключа реестра, в котором они перечислены. См. Https://stackoverflow.com/questions/3555749/microsoft-known-dll для получения подробной информации. Добавив `opengl32.dll` в этот список, вы можете указать Windows, где найти` opengl32.dll` на диске.
MSalters 6 лет назад
0