Delphi LoadLibrary не удается найти другой каталог DLL - есть ли хорошие варианты?


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

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

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

Поскольку мы загнали себя в угол, мне нужно знать, есть ли какие-то варианты, которые я упустил из виду. Хотя мы не можем изменить код (для этого выпуска), мы можем настроить установщик. Я нашел это место. c:fooapp в путь работает. Как добавить вторую копию фу.dll непосредственно в c:program файлыunwantedstepchild. c:fooappfoo.exe всегда будет работать в то время как sadapp.exe работает, так что я надеялся, что Windows найдет его таким образом, но, видимо, нет. Есть ли способ сказать Windows, что я действительно хочу ту же самую DLL? Может быть, манифест или что-то в этом роде? Это своего рода" волшебная пуля", которую я ищу. Я знаю, что могу:
  1. измените путь к windows, возможно, в установщике. Это отвратительно.
  2. добавьте вторую копию библиотеки DLL непосредственно в папку unwantedstepchild. Также некрасиво
  3. задержите проект, пока мы кодируем и тестируем правильное исправление. Неприемлемый.
  4. другие?

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

3 2

3 ответа:

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

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

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

Из MSDN-Doku :

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

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

SetDllDirectory(PChar('c:\fooapp'));

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