Как удалить dll openssl перед закрытием приложения

Я сделал простой инструмент (LogAndMailApplication), который отправляет журналы в мою учетную запись gmail, для этого я использовал компонент Indy TIdSSLIOHandlerSocketOpenSSL. Для работы необходимы ssleay32.dll и libeay32.dll.

Итак, при запуске приложения я извлекаю из ресурсов exe 2 dll и копирую их в папку приложения.

Все компоненты indy находятся в модуле данных, который я уничтожаю перед закрытием приложения.

После уничтожения модуля данных я пытаюсь удалить библиотеки DLL, но не могу.

Я просто использовал DeleteFile, но он отлично работал со всеми другими файлами, которые я удаляю при выходе из приложения (включая файл ini).

Я попытался сделать простой exe, который просто удаляет 2 dll, и он работает. Значит проблема в том, что 2 dll как-то заблокированы, пока LogAndMailApplication не закроется, как решить проблему?


person LaBracca    schedule 04.11.2010    source источник
comment
Если библиотеки DLL скрыты в исполняемом файле, как пользователи или администраторы могут заменить библиотеки DLL на более новую версию, если им нужен критический патч безопасности?   -  person mjn    schedule 04.11.2010
comment
Они не могут, но здесь это не имеет смысла. Я просто отправляю себе электронное письмо. Я устанавливаю это только на 3 клиента, так что пока это управляемо.   -  person LaBracca    schedule 04.11.2010
comment
Зачем вообще нужно удалять библиотеки DLL? Почему бы просто не сохранить их в каталоге приложения, чтобы они были готовы к использованию в следующий раз? (И если на то пошло, почему бы вам просто не сделать так, чтобы установщик не поместил их туда?)   -  person Rob Kennedy    schedule 04.11.2010
comment
Если ваше приложение извлекает библиотеки DLL в папку приложения, ему потребуется запускаться с повышенными привилегиями в Vista или более новых окнах с включенным UAC (по умолчанию). Как предлагает Роб, установщик должен поместить их туда.   -  person jachguate    schedule 04.11.2010
comment
В порядке. это просто быстрый и грязный инструмент, мне не нужен установщик.   -  person LaBracca    schedule 05.11.2010


Ответы (3)


Вы можете сделать следующее: в самом конце кода используйте

FreeLibrary (GetModuleHandle ('ssleay32.dll')); FreeLibrary (GetModuleHandle ('libeay32.dll')); DeleteFile (PathToDLL1); DeleteFile (PathToDLL2);

Это должно сработать.

В качестве альтернативы вы можете избавиться от OpenSSL и использовать компоненты SSL из нашего SecureBlackbox.

person Eugene Mayevski 'Callback    schedule 04.11.2010
comment
Большое спасибо, ваше предложение сработало (и теперь я теперь, как отменить регистрацию DLL). - person LaBracca; 04.11.2010
comment
Это плохой совет. Indy имеет множество ссылок на функции DLL, выделенные объекты (обратные вызовы и т. Д.), Переданные в / из DLL и т. Д. Выгрузка DLL напрямую с помощью FreeLibrary () сама по себе не позволяет Indy очищать все, что он использует внутри. Indy имеет свои собственные функции для безопасной выгрузки DLL. Вместо этого вы должны использовать их. Смотрите мой другой ответ. - person Remy Lebeau; 04.11.2010
comment
@Remy на самом деле, выгрузка DLL при завершении работы не должна вызывать никаких проблем, если вы не сохраняете указатели на объекты библиотеки, к которым вы получаете доступ при завершении работы. Хотя, конечно, вызов вашего метода - лучшее решение. И избавиться от OpenSSL намного лучше. - person Eugene Mayevski 'Callback; 05.11.2010
comment
Если вы вызовете FreeLibrary () напрямую, Indy не узнает об этом и попытается снова выгрузить библиотеки DLL. Это может вызвать ошибки, сбои и т. Д. Поскольку Indy загружает библиотеки DLL, Indy должен быть тем, кто их выгружает. - person Remy Lebeau; 05.11.2010
comment
@Remy, а как вызов FreeLibrary с недопустимым дескриптором может привести к сбоям и т. Д.? Windows справится с этим осторожно. - person Eugene Mayevski 'Callback; 05.11.2010
comment
Indy вызывает несколько функций OpenSSL DLL во время своей логики выгрузки, поэтому, если библиотеки DLL выгружаются вручную, эти функции не могут быть вызваны правильно. - person Remy Lebeau; 05.11.2010

Indy динамически загружает библиотеки DLL OpenSSL во время выполнения, а затем по умолчанию не выгружает их до завершения работы приложения. Если вы хотите выгрузить библиотеки DLL раньше, вам нужно вызвать IdSSLOpenSSL.UnLoadOpenSSLLibrary() напрямую. Это выгружает библиотеки DLL и очищает все ссылки и связанные с ними объекты.

person Remy Lebeau    schedule 04.11.2010

В качестве альтернативы вы можете удалить DLL в разделе финализации модуля данных ...

person Community    schedule 05.11.2010