ReapeR
>Как правильно вызывать процедуры и функции из ДЛЛ?
Кусок из статьи "Эксплуатационные 'режимы' использования динамически компонуемых библиотек.", кажется на delphi.mastak.ru было.
Цитата:
Статическая загрузка:
...
implementation
function ShowMyDialog(Msg: PChar): Boolean; stdcall; external 'project1.dll';
procedure SetValue(); cdecl; external 'some.dll';
...
Динамическая загрузка:
...
uses
...
type
{определяем процедурный тип, отражающий экспортируемую процедуру или функцию}
TMyProcType = procedure (flag : Boolean); stdcall;
TMyFuncType = function (Msg: PChar): Boolean; cdecl;
{эту операцию можно сделать непосредственно в разделе var процедуры, в которой вы будите загружать dll}
...
procedure TForm1.Button1Click(Sender: TObject);
var
SetValue: TMyProcType; {объявляем переменные процедурного типа}
ShowDialog: TMyFuncType;
// или можно было сделать так (в таком случае type... не нужен):
// SetValue: procedure (flag : Boolean); stdcall;
// ShowDialog: function (Msg: PChar): Boolean; cdecl;
Handle01, Handle02: HWND; {дескрипторы, загружаемых библиотек}
begin
Handle01:= LoadLibrary(PChar('project1.dll')); { загрузка dll }
try
@ShowDialog:=GetProcAddress(Handle01, 'ShowMyDialog'); { получаем указатель на необходимую процедуру}
ShowDialog(PChar('Dll function is working !!!')); { используем функцию }
except
ShowMessage('Ошибка при попытке использовать dll !');
finally
FreeLibrary(Handle01); { выгружаем dll }
end; { try }
end;
end.
Аналогично и с процедурой SetValue();
|
и т.д.
>как только я выполняю её по второму разу, то выдает ошибку.
Скорей всего че-нить не освобождаешь/переполняешь и т.д.