Средства разработки приложений


Вызов процедур и функций, загруженных из DLL. - часть 2


Вызов процедур и функций, импортируемых из динамически загружаемых библиотек несколько более сложен, чем рассмотренный нами выше способ. В данном случае требуется объявить указатель на функцию или процедуру, которую вы собираетесь использовать. Помните процедуру HelloWorld? Давайте посмотрим, что необходимо сделать для того, чтобы вызвать ее на выполнение в случае динамической загрузки DLL. Во-первых, вам необходимо объявить тип, который описывал бы эту процедуру: type THelloWorld = procedure(AForm : TForm);

Теперь вы должны загрузить динамическую библиотеку, с помощью GetProcAddress получить указатель на процедуру, вызвать эту процедуру на выполнение, и, наконец, выгрузить DLL из памяти. Ниже приведен код, демонстрирующий, как это можно сделать: var DLLInstance : THandle; HelloWorld : THelloWorld; begin { загружаем DLL } DLLInstance := LoadLibrary(myfirstdll.dll'); { получаем указатель } @HelloWorld := GetProcAddress(DLLInstance, HelloWorld'); { вызываем процедуру на выполнение } HelloWorld(Self); { выгружаем DLL из оперативной памяти } FreeLibrary(DLLInstance); end;

Как уже говорилось выше, одним из недостатков статической загрузки DLL является невозможность продолжения работы приложения при отсутствии одной или нескольких библиотек. В случае с динамической загрузкой у вас появляется возможность программно обрабатывать такие ситуации и не допускать, чтобы программа "вываливалась" самостоятельно. По возвращаемому функциями LoadLibrary и GetProcAddress значениям можно определить, успешно ли прошла загрузка библиотеки и найдена ли в ней необходимая приложению процедура. Приведенный ниже код демонстрирует это. procedure TForm1.DynamicLoadBtnClick(Sender: TObject); type THelloWorld = procedure(AForm : TForm); var DLLInstance : THandle; HelloWorld : THelloWorld; begin DLLInstance := LoadLibrary(myfirstdll.dll'); if DLLInstance = 0 then begin MessageDlg(Невозможно загрузить DLL', mtError, [mbOK], 0); Exit; end; @HelloWorld := GetProcAddress(DLLInstance, HelloWorld'); if @HelloWorld <> nil then HelloWorld (Self) else MessageDlg(Не найдена искомая процедура!.', mtError, [mbOK], 0); FreeLibrary(DLLInstance); end;

В DLL можно хранить не только код, но и формы.


Начало  Назад  Вперед



Книжный магазин