Как удалить openssl dll перед закрытием приложения - PullRequest
0 голосов
/ 04 ноября 2010

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 04 ноября 2010

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

3 голосов
/ 04 ноября 2010

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

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

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

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

1 голос
/ 05 ноября 2010

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

...