Главная страница
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.012 c
14-59921
Kate
2003-04-29 10:17
2003.05.19
Chart в Excel


14-59865
cult
2003-04-28 15:22
2003.05.19
где бы почитать про TAPI?


3-59597
dimosik
2003-04-28 11:59
2003.05.19
Подстановка при просмотре в нужное поле значения


6-59829
delkos
2003-03-22 21:32
2003.05.19
Открытие веб страницы


14-59896
xman
2003-04-28 21:15
2003.05.19
палитра в bmp файле