Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
8-59817
Sterh
2003-02-07 21:25
2003.05.19
MP3


1-59738
Zergling
2003-05-06 06:29
2003.05.19
Поиск и замена текста


14-59850
Дмитрий К.К.
2003-04-30 07:29
2003.05.19
Именинники 30 апреля


14-59902
Alex134
2003-04-29 00:42
2003.05.19
Отладчик - Вопрос серьезный, для Мастеров


1-59656
Hacker.
2003-05-03 08:26
2003.05.19
Сохранение типов.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский