Главная страница
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.015 c
1-59745
Fighter
2003-05-06 10:21
2003.05.19
Как обращаться к объекту по


14-59864
Slavik
2003-04-29 01:12
2003.05.19
Transfer of application from Delphi 5 to Delphi 7


6-59842
zyb
2003-03-21 10:50
2003.05.19
IP->имя компьютера


1-59682
odrik
2003-05-05 16:57
2003.05.19
поиск


1-59740
Skalp
2003-05-06 09:53
2003.05.19
Как поместить в файл ресурса (*.res) поместить файл *.bmp ...