Форум: "Система";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться с 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c