Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.19;
Скачать: CL | DM;

Вниз

Помогите разобраться с DLL!   Найти похожие ветки 

 
MyName   (2003-03-23 08:25) [0]

Здравствуйте! Как обратиться к функции в DLL из своей программы? Пишу следующее:
{----DLL------}
library TestDll;
uses
SysUtils,
Classes,
Dialogs;

PROCEDURE TestProc1; export;
BEGIN
showmessage("123");
END;

PROCEDURE TestProc2(var str_a:string); export;
BEGIN
str_a:="123";
END;

FUNCTION TestFunc1:string; export;
BEGIN
result:="123";
END;

exports TestProc1,TestProc2,TestFunc1;

begin
end.


{---EXE----}
{..}
procedure TForm1.Button1Click(Sender: TObject);
type
TCallDll = procedure;
var
CallDll: TCallDll;
FuncPtr: TFarProc;
hDll: THandle;
begin
hDll:=LoadLibrary("TestDll.dll");
FuncPtr:=GetProcAddress(hDLL,"TestProc1");
@CallDll:=FuncPtr;
if @CallDll <> nil then CallDll;
FuncPtr:=nil;
FreeLibrary(hDll);
end;
{--------}
procedure TForm1.Button2Click(Sender: TObject);
type
TCallDll = procedure(var str_a:sting);
var
CallDll: TCallDll;
FuncPtr: TFarProc;
hDll: THandle;
str_s:string;
begin
hDll:=LoadLibrary("TestDll.dll");
FuncPtr:=GetProcAddress(hDLL,"TestProc2");
@CallDll:=FuncPtr;
if @CallDll <> nil then CallDll(str_s);
FuncPtr:=nil;
FreeLibrary(hDll);
Showmessage(str_s);
end;
{----}
procedure TForm1.Button3Click(Sender: TObject);
type
TCallDll = function:string;
var
CallDll: TCallDll;
FuncPtr: TFarProc;
hDll: THandle;
str_s:string;
begin
hDll:=LoadLibrary("TestDll.dll");
FuncPtr:=GetProcAddress(hDLL,"TestFunc1");
@CallDll:=FuncPtr;
if @CallDll <> nil then str_s:=CallDll;
FuncPtr:=nil;
FreeLibrary(hDll);
Showmessage(str_s);
end;
{..}


{-----------------}
В первом случае все OK, а вдругих двух возникает ошибка. Что здесь не так?


 
y-soft ©   (2003-03-23 08:56) [1]

Во 2-м и 3-м случаях вы экспортируете параметры типа string и не указали в uses первым ShareMem. Возникают проблемы с освобождением памяти, выделенной под эти строки. Лучше никогда не экспортировать из Dll ни в каком виде string, а использовать PChar, array of Char, указатель на буфер и т.д., и, если память выделяется в Dll, а должна освобождаться в вызывающей программе, то использовать средства Windows вместо менеджера памяти Delphi



Страницы: 1 вся ветка

Текущий архив: 2003.05.19;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.01 c
3-59620
VoronBor
2003-04-28 02:56
2003.05.19
Paradox таблицы в SQl используя ADO


3-59568
Officeman
2003-04-25 19:33
2003.05.19
Помогите с DBGRID-ом и MEMO ! Спасибо!


3-59598
Deedlit
2003-04-27 13:46
2003.05.19
SQL запрос: поиск двойников


1-59788
GarT
2003-05-07 01:27
2003.05.19
Ввод символа.


1-59701
Delpher
2003-05-07 16:49
2003.05.19
Данные из файла в последовательность...