Форум: "Система";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
ВнизВопрос по DLL Найти похожие ветки
← →
BJValentine (2003-02-12 17:58) [0]Создал DLL с формой. В итоге получилась процедура, возвращающая 3 значения с этой формы. Использую её (DLL) в программе. При первом вызове происходит всё нормально. Но после первого вызова при выходе с программы матюкается (Runtime error 217, а потом 216) и на этом всё заканчивается. И при вторичном вызове процедуры ругается. Что это может быть?
Фрагмент кода программы:
implementation
{$R *.DFM}
procedure GetSeq(var UserName:Pchar; Var Pwrd:Pchar; Var Finita: boolean); far; external "seq32.dll";
procedure TForm1.Button1Click(Sender: TObject);
begin
GetSeq(V1,v2,v3);
Edit1.Text:=StrPas(v1);
Edit2.Text:=StrPas(v2);
if V3
then Edit3.Text:="true"
else Edit3.Text:="false";
end;
фрагмент кода DLL:
var
Form1: TForm1;
v1,v2: PChar;
V3: boolean;
procedure GetSeq(var UserName: PChar; var Pwrd: PChar; var finita: boolean);export;
implementation
{$R *.DFM}
procedure GetSeq(var UserName: PChar; var Pwrd: PChar; var finita: boolean);
var SeqFrm: TForm1;
begin
try
SeqFrm:=TForm1.Create(Application);
SeqFrm.ShowModal;
UserName:=v1;
Pwrd:=v2;
finita:=v3;
finally
SeqFrm.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
V3:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
v1:=PChar(Edit1.Text);
v2:=PChar(Edit2.Text);
v3:=False;
Close;
end;
← →
Ihor Osov'yak (2003-02-13 02:01) [1]ух, блин...
Правило первое и последнее, читать до посинения: пока не будет ясного понимания, что где создается, сколько времени живет, когда уничтожается, что скрівается за механизмом присваевания строк которые string и как работает присваивание для PChar, и что такое Application в dll, а что такое в основной программе ДО ТЕХ ПОР с ничем визуальным в dll не не работать. PChar не юзать. за StrPas забыть от сегодня и навсегда. Но это прелюдия. Напонминание на всяк случай.
А теперь по сути. Из исходного кода не понятно, как инициализируются в длл области памяти, на которые смотрят v1,v2,v3, которые в свою очередь (вернее их значения, показывающие на соотв. фрагменты памяти) через параметры GetSeq передаются в основную программу. Тем более, непонятно, где эта память освобождается. Может к моменту юзания этих значений в основной программе эта память уже освобождена.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c