Коллекция DLL в другой назначенной папке? - PullRequest
4 голосов
/ 14 декабря 2011

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

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

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

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

EDIT:

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

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

Ответы [ 5 ]

5 голосов
/ 14 декабря 2011

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

4 голосов
/ 14 декабря 2011

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

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

Существует нечто, называемое DLL Redirection , но MS не рекомендует использовать это. Они рекомендуют использовать компоненты рядом друг с другом. Сказав это, команда Visual Studio отодвинулась на от параллельных компонентов со средой выполнения MSVC в VS2010 из-за боли, возникшей рядом в предыдущем выпуске.

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

Обновление

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

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

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

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

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

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

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

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

0 голосов
/ 15 апреля 2016

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

Вы можете указать путь к DLL в ярлыке приложения (в поле «Начать с»).

...