Коллекция dll файлы в другую указанную папку?



Во - первых, пожалуйста, простите меня за незнание правильной терминологии, я уверен, что есть очень распространенное техническое название для этого, которое я мог бы просто поискать в Google для справки-но я не могу найти помощь, если я не знаю термин для начала.



Я строю модульную систему в Delphi 7. Есть несколько приложений, и куча dll файлы. Все приложения используют эти dll файлы, а также некоторые dll файлы использовать другие dll файлы. Библиотеки DLL являются в настоящее время сохраняется в том же месте, как приложение. Вместо этого я хотел бы поместить все эти DLL в подпапку (в другом месте от EXE), но, конечно, Delphi не будет знать, как их найти.



Есть ли способ, которым я могу направить свои приложения Delphi на поиск DLL в определенном каталоге? Он не может использовать Contstants, потому что будет возможность указать, где хранятся DLL.



Эти DLL-это просто простая коллекция функций StdCall в каждой, ничего особенного.



Редактировать:



Чтобы объяснить причину, по которой я хотите сохранить DLL в своей папке: эта система, которую я создаю, рассматривает эти DLL как дополнения. По умолчанию система может даже не иметь никаких дополнений. С другой стороны, это также позволит различным поставщикам создавать другие DLL и включать их в качестве дополнений. Затем каждое приложение, требующее этих дополнений, будет направлено в папку, где их можно найти.
Приложение само будет иметь свою собственную библиотеку DLL, которая будет находиться в том же каталоге, что и приложения. Но библиотеки DLL поставщиков я бы любят держаться порознь.



Как уже упоминалось в ответах ниже, лучше всего было бы реализовать метод импорта DLL, потому что А) я могу указать путь для каждой библиотеки DLL, которую он импортирует, б) я могу лучше контролировать использование каждой библиотеки DLL (нужно ли ее загружать или нет?) и C) каждая библиотека DLL технически может находиться в отдельных папках (поставщики могут захотеть построить свою собственную структуру папок). Эта система еще очень зрелая, но я планирую сделать ее более гибкой.

712   5  

5 ответов:

Вы можете сделать это с PATH, но я рекомендую вам этого не делать.это жестокий и негибкий подход. И, конечно, вам нужно изменить системный путь, чтобы он имел какой-либо эффект во время загрузки исполняемого файла.

Библиотеки DLL можно загрузить явно с помощью LoadLibrary и GetProcAddress. Это не весело, если есть много импорта, но это может быть хорошим вариантом в противном случае. И помните,что если вы пойдете по этому пути, каждая библиотека DLL должна переключиться на явное связывание.

Существует нечто под названием DLL Перенаправление но MS не рекомендует вам использовать это. Они рекомендуют использовать параллельные компоненты. Сказав это, команда Visual Studio отодвинула от параллельных компонентов с MSVC runtime в VS2010 из-за боли, которую side-by-side вызвал в предыдущем выпуске.

Таким образом, несмотря на все варианты, я действительно считаю, что лучшее решение-поместить все библиотеки DLL в один каталог с исполняемым файлом. Если вы можете добраться до папки, выглядя неопрятно тогда жизнь станет намного проще. Это тривиальное решение проблемы без усилий.

Обновить

Обновление к вашему вопросу предоставляет дополнительную информацию о том, что эти библиотеки DLL являются необязательными дополнениями. В этом случае у вас просто нет альтернативы, кроме как использовать явное связывание с LoadLibrary и GetProcAddress.

Если вы динамически загружаете библиотеки DLL в свой код, вы можете хранить их где угодно, так как вам все равно нужно передать полный путь к LoadLibrary/Ex(). Если вместо этого вы статически связываетесь с библиотеками DLL, то вы можете использовать SetDllDirectory() чтобы указать дополнительный путь для включения в поисковый путь DLL ОС.

Я настоятельно рекомендую вам оставить DLL-файлы в той же папке, что и приложения.

Если вы действительно хотите пойти по пути размещения DLL в отдельной папке, то вам нужно знать, можете ли вы загрузить DLL с помощью LoadLibrary API, который также позволяет спецификацию пути. Однако если библиотеки DLL загружаются статически, то поиск выполняется в Windows. Поиск Windows сначала ищет в папке приложения, а затем ищет путь к Windows. Кроме того, поскольку Delphi 7 создает только 32-разрядные приложения, это может привести к беспорядку под Windows 64 bit.

В Windows существует"порядок поиска DLL ". Один из этих путей поиска - The directory from which the application loaded, поэтому он работает, чтобы иметь их в той же папке, что и EXE.

Если вы статически связаны с библиотеками DLL, они должны быть загружены при загрузке EXE-файла в память. Это происходит до выполнения первой строки кода. Итак, вы полагаетесь на то, что библиотеки DLL находятся в одном из путей поиска. В этом случае вы застряли с установкой пути, и вы должны установить его перед программой погрузка.

Если вы динамически подключаетесь к библиотекам DLL, то вы можете использовать LoadLibrary/LoadLibraryEx чтобы загрузить библиотеки DLL во время выполнения, в коде. Используя эти функции, вы должны указать путь к библиотеке DLL, чтобы библиотеки DLL могли находиться где угодно. В этом случае, я считаю, что это допустимо, чтобы поместить библиотеки DLL в отдельную папку, чтобы держать вещи в порядке. До тех пор, пока вы не поместите библиотеки DLL в общую папку, такую как папка Windows System32, вы избежите многих головных болей.

Временное решение:

Вы можете задать путь к DLL в ярлыке вашего приложения (в поле" Start in").

Comments

    Ничего не найдено.