Приветствую Вас Заглянувший | RSS

Подработка и работа в интернете

Среда, 02.09.2026, 00:56
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Основы Dll для начинающих 2 часть
NIKIOPДата: Пятница, 30.03.2012, 12:09 | Сообщение # 1
Знаток
Группа: Свой человек
Сообщений: 63
Репутация: 4
Явная(Динамическая) загрузка
Сейчас мы рассмотрим Динамическую или как еще говорят Явную загрузку библиотек. Она по объему кода конечно больше чем Неявная(статическая) но зато более гибкая.

Возьмем наш прошлый проект,и переделаем под явную(динамическую) загрузку.
Теперь вызов выглядит вот так

Сумма двух чисел:
Код Delphi
procedure TForm1.btn1Click(Sender: TObject);
var
a,b,c:integer; //переменные для чисел
dHandle: THandle; //Хендл загруженной Dll
Symma: function (a,b:integer):Integer;stdcall; //описываем нашу функцию
begin
//Symma теперь не на какой участок памити не указывает
@Symma:=nil;
//Пытаемся загрузить Dll
dHandle:=LoadLibrary('Math.dll');
//Если загрузили то
if dHandle<>0 then
begin
//Найдем адрес нужной функции и присвоим его переменной Symma
@Symma:=GetProcAddress(dHandle,'Symma');
//если мы нашли функции в Dll и получили её адрес то
if @Symma<>nil then
begin
a:=StrToInt(edt1.text);
b:=StrToInt(edt2.text);
C:=Symma(a,b);
lblResult.Caption := 'Результат:' + IntToStr©;
end
else //если мы не нашли функцию в Dll
begin
lblResult.Caption := 'Результат:Функция не найдена в Dll';
Exit;
end;
//выгружаем Dll из памяти
FreeLibrary(dHandle);
end
else
begin
//если Dll не может быть загружена или не найдена
lblResult.Caption := 'Результат:Библеотека не найдена';
Exit;
end;
end;
Факториал числа:
Код Delphi
procedure TForm1.btn2Click(Sender: TObject);
var N:Integer;
dHandle: THandle;
Fucktorial: function (N:integer):integer;stdcall;
begin
@Fucktorial:=nil;
dHandle:=LoadLibrary('Math.dll'); //Грузим Dll
if dHandle<>0 then begin
@Fucktorial:=GetProcAddress(dHandle,'Fucktorial');
if @Fucktorial<>nil then
begin
N:=StrToInt(edt1.text);
lblResult.Caption := 'Результат:' + IntToStr(Fucktorial(N));
end
else
begin
lblResult.Caption := 'Результат:Функция не найдена в Dll';
Exit;
end;
FreeLibrary(dHandle);
end
else
begin
lblResult.Caption := 'Результат:Библеотека не найдена';
Exit;
end;

end;
Вы можете испугаться такого количества кода,по сравнению с неявной загрузкой, но когда вы разберетесь все будет казаться простым.

Так как форум не резиновый,я не смог поместить сюда всю информацию.В моей небольшой справке я поместил данную статью и статью по работе с формами в Dll.Найти её можно в конце статьи.
 
  • Страница 1 из 1
  • 1
Поиск: