Главная страница
    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.45 MB
Время: 0.007 c
1-59683
Радик
2003-05-07 16:12
2003.05.19
Открыть Word


3-59623
Андрей
2003-04-29 00:19
2003.05.19
Перенос из Paradox-a в MS SQL


1-59666
tytus
2003-05-03 09:04
2003.05.19
Моя кнопка (Код прилагается)


6-59839
TonnyS
2003-03-12 15:01
2003.05.19
TClientSocket и TServerSocket: вопросы по принципам работы


1-59698
Filat
2003-04-30 20:52
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский