Delphi LoadLibrary Не удается найти другую директорию DLL - есть ли хорошие варианты? - PullRequest
2 голосов
/ 30 марта 2010

Две программы Delphi должны загрузить foo.dll, который содержит некоторый код, который внедряет сертификат аутентификации клиента в запрос SOAP. foo.dll находится в c: \ fooapp \ foo.dll и обычно загружается c: \ fooapp \ foo.exe. Это отлично работает. Другой программе нужна та же функциональность, но она находится в каталоге c: \ program files \ unwantedstepchild \ sadapp.exe. Обе ап загружают DLL с этим кодом:

FOOLib := LoadLibrary('foo.dll'); 
...
If FOOLib <> 0 then 
begin
  FOOProc := GetProcAddress(FOOLib , 'xInjectCert');
  FOOProc(myHttpRequest, Data, CertName);
end;

Отлично работает для foo.exe, так как DLL прямо здесь. sadapp.exe не может загрузить библиотеку, поэтому FOOLib равен 0, а остальное никогда не вызывается. Поэтому программа sadapp.exe молча не может внедрить сертификат, и когда мы проверяем продукт, если сертификат отсутствует, происходит ли сбой соединения. Очевидно, мы должны были полностью указать путь к DLL. Не вдаваясь в подробности, до недавнего времени были аспекты тестирования, которые маскировали эту проблему, и теперь в основном уже слишком поздно исправлять код, поскольку для этого потребуется полный регрессионный тест, и времени для этого нет.

Поскольку мы загнали себя в угол, мне нужно знать, есть ли какие-то варианты, которые я упустил. Хотя мы не можем изменить код (для этого выпуска), мы МОЖЕМ подправить установщик. Я обнаружил, что размещение c: \ fooapp в путь работает. Как и добавление второй копии файла foo.dll непосредственно в c: \ program files \ unwantedstepchild. c: \ fooapp \ foo.exe всегда будет работать, пока запущен sadapp.exe, поэтому я надеялся, что Windows найдет его таким образом, но, очевидно, нет. Есть ли способ сказать Windows, что я действительно хочу эту же DLL? Может быть, манифест или что-то? Это своего рода «волшебная пуля», которую я ищу. Я знаю, что могу:

  1. Изменить путь к Windows, возможно, в установщике. Это безобразно.
  2. Добавьте вторую копию DLL прямо в папку unwantedstepchild. Тоже некрасиво
  3. Задержка проекта, пока мы кодируем и тестируем правильное исправление. Неприемлемо.
  4. Другое

Спасибо за любые рекомендации, особенно с "Другое". Я понимаю, что эта проблема не обязательно специфична для Delphi. Спасибо!

Ответы [ 3 ]

9 голосов
/ 30 марта 2010

В документации MSDN для LoadLibrary точно указано, где Windows будет искать библиотеки DLL. Вы должны либо жестко прописать путь к DLL, либо поместить его в ту же папку, что и ваше приложение, либо поместить его в одно из тех мест поиска по умолчанию из документации LoadLibrary.

2 голосов
/ 28 декабря 2017

Это не совсем решение для заданного вопроса, но это помогло бы мне, когда я наткнулся на этот вопрос:

Вы можете расширить путь поиска для LoadLibrary с помощью SetDllDirectory.

С MSDN-Доку :

Путь поиска можно изменить с помощью функции SetDllDirectory. Это решение рекомендуется вместо использования SetCurrentDirectory или жестко запрограммировать полный путь к DLL.

Вам нужно было бы добавить одну строку перед вызовом LoadLibrary:

SetDllDirectory(PChar('c:\fooapp'));
0 голосов
/ 30 марта 2010

Или вы можете просто отредактировать переменную окружения "path" и поместить туда путь к dll. В этом случае добавление ;c:\fooapp к пути должно быть достаточным. Поскольку изменение среды родительского элемента влияет на дочерний элемент, вы также можете создать приложение-загрузчик, которое настраивает переменную среды, а затем порождает ваше приложение.

...