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? Может быть, манифест или что-то в этом роде? Это своего рода" волшебная пуля", которую я ищу. Я знаю, что могу:- измените путь к windows, возможно, в установщике. Это отвратительно.
- добавьте вторую копию библиотеки DLL непосредственно в папку unwantedstepchild. Также некрасиво
- задержите проект, пока мы кодируем и тестируем правильное исправление. Неприемлемый.
- другие?
Спасибо за любые указания, особенно с "другими". Я понимаю,что этот вопрос не обязательно относится к Delphi. Спасибо!
3 ответа:
Документация MSDN дляLoadLibrary точно указывает, где Windows будет искать библиотеки DLL. Вы должны либо жестко закодировать путь к DLL, поместить его в ту же папку, что и ваше приложение, либо поместить его в одно из тех мест поиска по умолчанию из LoadLibrary docs.
Это не совсем решение для заданного вопроса, но оно помогло бы мне, когда я наткнулся на этот вопрос:
Вы можете расширить путь поиска для
LoadLibrary
черезSetDllDirectory
.Из MSDN-Doku :
Путь поиска можно изменить с помощью функции SetDllDirectory. Это решение рекомендуется использовать вместо SetCurrentDirectory или жесткий код полного пути к DLL.
Вам нужно было бы добавить одну строку, прежде чем ваш
LoadLibrary
вызов(ы):SetDllDirectory(PChar('c:\fooapp'));
Или вы можете просто отредактировать переменную окружения "path" и поместить туда путь к dll. В этом случае достаточно добавить
;c:\fooapp
к пути. Поскольку изменения среды родителя влияют на дочернее приложение, вы также можете создать приложение-загрузчик, которое настраивает переменную среды, а затем создает ее для вашего приложения.