Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Динамичесская загрузка ssleay32.dll и libeay32.dll


Автор: lollollollol 28.11.2013, 20:59
Здравствуйте. Моё приложение использует библиотеки ssleay32.dll и libeay32.dll.

Проблема в том, что если на компьютере нет этих dll, при запуске вылетает ошибка с оответствующим текстом (приложение не запущено т.к. нет длл, переустановите программу и т.д.)

Моя задача сделать так, чтобы программа вначале проверила наличие dll, и если их нет - скачала.

Для этого нужно динамичесски загрузить dllки.

Но вот незадача, в коде видно как используются функции тлько из одной dll, а для работы нужны обе!

Вырезка кода из Uses SSLSocket 
Ссылка где нашел модуль: http://forum.antichat.ru/showthread.php?t=145550
Код

implementation
 const SSL_LIB_NAME = 'ssleay32.dll';

function SSL_library_init:Integer; cdecl; external SSL_LIB_NAME;
function SSLv3_client_method:Pointer; cdecl; external SSL_LIB_NAME;
function SSL_CTX_new(meth: Pointer):Pointer; cdecl; external SSL_LIB_NAME;
function SSL_new(ctx: Pointer):Pointer; cdecl; external SSL_LIB_NAME;
function SSL_set_fd(s: pointer; fd: tsocket):Integer cdecl; external SSL_LIB_NAME;
function SSL_connect(ssl: pointer):Integer; cdecl; external SSL_LIB_NAME;
procedure SSL_free(ssl: pointer); cdecl; external SSL_LIB_NAME;
function SSL_read(ssl: pointer; buf: PChar; num: Integer):Integer; cdecl; external SSL_LIB_NAME;
function SSL_write(ssl: pointer; buf: PChar; num: Integer):Integer; cdecl; external SSL_LIB_NAME;





В Связи с этим 2 вопроса :
1. Функции которые динамичесски загрузятся из длл, автоматичесски загрузят всё что нужно из libeay32.dll?
2. Как сделать проверку, и импорт функций, если это используется в отдельном Uses? Хотелось бы при запуске проверить, в теле основной программы.
Или перефразирую: Импортирую из dll функции котрые описаны в USES, но ведь от туда они будут не доступны? или я ошибаюсь?

Автор: Akella 28.11.2013, 22:24
Просто проверь наличие этих файлов в папке приложения, например.

Добавлено через 2 минуты и 50 секунд
Цитата(lollollollol @  28.11.2013,  20:59 Найти цитируемый пост)
Моя задача сделать так, чтобы программа вначале проверила наличие dll, и если их нет - скачала.


ну и try/except никто не отменял.

При скачивании обрати внимание на тот факт, что Windows может дать по зубам твоей программе, т.к. программа будет запущена из папки program files, поэтому на время скачивания нужно запросить повышение/поднятие прав у ОС, чтобы было можно сохранить файлы в program files.

Автор: Pseex 28.11.2013, 22:45
Цитата(lollollollol @  28.11.2013,  20:59 Найти цитируемый пост)
Моя задача сделать так, чтобы программа вначале проверила наличие dll, и если их нет - скачала.

Просто кинуть длл-ки в папку к ехе-шнику не проще, чем проверять и выкачивать?

Автор: Akella 28.11.2013, 22:50
я всегда в установщик эти 2 файла "зашиваю"  smile 

Автор: Poseidon 28.11.2013, 23:45
Цитата(lollollollol @  28.11.2013,  20:59 Найти цитируемый пост)
Моя задача сделать так, чтобы программа вначале проверила наличие dll
Наличие проверяется функцией LoadOpenSSLLibrary из IdSSLOpenSSL. Ну а скачиваются они как обычные файлы из любого доступного источника.

Автор: lollollollol 29.11.2013, 04:18
Дак как я проверю наличие длл, если при запуске, в случае их отсутствия
ошибка:

Код

The program can't start because ssleay32.dll is missing from your
computer. Try reinstalling the program to fix this problem.


И эта ошибка выскакивает даже ДО выполниня первой строчки кода.

Программа пишется как сервер, не имеет визуальной оболочки. (один .dpr файл)

Автор: lollollollol 29.11.2013, 20:16
Есть варианты?

Автор: Poseidon 29.11.2013, 21:58
В таком случае создай условия, гарантирующие наличие этих баблиотек. К примеру методом, предложенным Akella

Автор: Dik0n 29.11.2013, 22:26
В чем проблема то вообще ?

Код

implementation
  const SSL_LIB_NAME = 'ssleay32.dll';
var
  SSL_library_init: function():Integer; cdecl;

h := LoadLibrary(SSL_LIB_NAME);

if h <> 0 then
begin
  @SSL_library_init := GetProcAddress(h, 'SSL_library_init');
  ...
  ...
end else
  // download...

Автор: lollollollol 30.11.2013, 08:09
А вариант с динамической загрузкой?

Цитата

В Связи с этим 2 вопроса :
1. Функции которые динамичесски загрузятся из длл, автоматичесски загрузят всё что нужно из libeay32.dll?
2. Как сделать проверку, и импорт функций, если это используется в отдельном Uses? Хотелось бы при запуске проверить, в теле основной программы.
Или перефразирую: Импортирую из dll функции котрые описаны в USES, но ведь от туда они будут не доступны? или я ошибаюсь? 

Автор: lollollollol 30.11.2013, 16:29
Цитата

В чем проблема то вообще ?



Точно, не думал что прям в uses можно

Автор: lollollollol 30.11.2013, 19:58
только остался один вопрос, как из USES добраться до константы основной программы?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)