Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.13;
Скачать: CL | DM;

Вниз

DLL   Найти похожие ветки 

 
atmospheric   (2004-02-02 16:37) [0]

пишу в длл:

function List: TStringList;
begin
List := TStringList.Create;
List.Add("1");
Result := List;
List.Free;
end;


в ехе:

function List: TStringList; stdcall; external "gentest.dll";
...
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines := List;
end;

не работает, программа вылетает.

Что не так, почему string работает криво, а PChar нормально ?


 
Stas ©   (2004-02-02 16:40) [1]

А у меня работает !

function List: TStringList;
begin
Result := TStringList.Create;
Result.Add("1");
end;


 
Тимохов ©   (2004-02-02 16:42) [2]


> List.Free;

Это зачем? Убери на фиг...


 
Digitman ©   (2004-02-02 16:43) [3]

для начала List.Free убери


 
Jel ©   (2004-02-02 16:45) [4]


> function List: TStringList;
> begin
> List := TStringList.Create;
> List.Add("1");
> Result := List;
> List.Free;
> end;


Во-первых освобождать его рано.
Во-вторых uses ShareMem и длиннющий коментарий вставляемый средой в начало dll при ее создании обязателен к прочтению.


 
AKul ©   (2004-02-02 16:50) [5]


> atmospheric (02.02.04 16:37)
> пишу в длл:
> function List: TStringList;

> в ехе:
> function List: TStringList; stdcall; external "gentest.dll";


И внимательно посмотреть на эти строчки (особенно на выделенное жирным)


 
Stas ©   (2004-02-02 16:54) [6]

Если будешь использовать ShareMem, то обрати внимание что тебе нужно с прогой еще dll таскать, нипомню как она называется.


 
atmospheric   (2004-02-02 16:54) [7]

и с ShareMem, не работает (Stack Overflow) :((


 
AKul ©   (2004-02-02 16:58) [8]

Либо добавь stdcall в объявлении функции в DLL, либо убери его в EXE.


 
Digitman ©   (2004-02-02 17:00) [9]


> atmospheric


соглашения о вызове должны быть идентичны
если приспичило stdcall, соотв.декларации в вызывающем и вызываемом коде должны содержать stdcall

sharemem нужен и в вызывающем и в вызываемом проектах (одновременно и там и там) лишь в случае, если хотя бы один из них собран без опции Build With Run-Time Packages (версии Делфи , в которы х разрабатывались обе части, разумеется, д.б. одинаковыми)


 
atmospheric   (2004-02-02 17:02) [10]

и stdcall и без него не работает, все таже ошибка :(


 
Digitman ©   (2004-02-02 17:04) [11]

приводи полный код


 
atmospheric   (2004-02-02 17:07) [12]

gentest.dpr/.dll

library gentest;

uses ShareMem,
SysUtils,
Classes;

{$R *.RES}

function Version: PChar; stdcall;
begin
Result := "0.1";
end;

function List: TStringList; stdcall;
begin
List := TStringList.Create;
List.Add("1");
List.Add("2");
List.Add("3");
Result := List;
//List.Free;
end;

exports Version;
exports List;

begin
end.



.exe (.pas)


implementation

function Version: PChar; stdcall; external "gentest.dll";
function List: TStringList; stdcall; external "gentest.dll";
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
//ShowMessage(Version);
Memo1.Lines := List;
end;

end.


.exe (.dpr)

uses ShareMem,
Forms,
Unit1 in "Unit1.pas" {Form1};


 
AKul ©   (2004-02-02 17:07) [13]


> atmospheric (02.02.04 16:54) [7]
> и с ShareMem, не работает (Stack Overflow) :((


А переполнение (Stack Overflow) происходит из-за рекурсивного вызова List:

> begin
> List := TStringList.Create;
> List.Add("1");
> Result := List; // А вот и наша рекурсия
> end;


Используй
Result:=... Create
Resul.Add(...
end;


 
Digitman ©   (2004-02-02 17:13) [14]


> atmospheric


срочно избавляйся от привычки возвращать результат с использованием имени тек.ф-ции .. как, очевидно, ты привык это делать в ТурбоПаскале или Васике ... всегда пользуй ключ.слово "Result"


 
AKul ©   (2004-02-02 17:14) [15]

Неудачно скопировал, так нагляднее:

> function List: TStringList;
> begin
> List := TStringList.Create;
> List.Add("1");
> Result := List; // Вызов этой же самой List
> List.Free;
> end;


 
atmospheric   (2004-02-02 17:19) [16]

угу понял...

только он теперь говорит - "Cannot assign a TStringList to a TMemoStrings"

делал -

var
listX: TStringList;
begin
listX := TStringList.Create;
listX := List;
Memo1.Lines := listX;

listX.Free;
end;

все равно


 
Тимохов ©   (2004-02-02 17:22) [17]


> listX := TStringList.Create;

Эта строка зачем?
На фиг ее...


 
Digitman ©   (2004-02-02 17:28) [18]

var
listX: TStringList;
begin
listX := List;
try
Memo1.Lines.Assign(listX);
finally
listX.Free;
end;
end;


 
atmospheric   (2004-02-02 17:40) [19]

try .. finally и с ними тоже не работает :((

ну что же это такое...


 
Семен Сорокин ©   (2004-02-02 17:44) [20]

atmospheric (02.02.04 17:40) [19]
Memo1.Lines.AddStrings(List);
а где твой мемо в Dll?


 
Digitman ©   (2004-02-02 17:44) [21]


> atmospheric (02.02.04 17:40) [19]


брось эту затею ... метод "научного тыка" оправдан далеко не в таких случаях
пора за книжки садиться и изучать теорет.материал


 
AKul ©   (2004-02-02 17:46) [22]


> atmospheric (02.02.04 17:40) [19]
> try .. finally и с ними тоже не работает :((


А в чем заключается неработоспособность?


 
atmospheric   (2004-02-02 17:56) [23]

с try finally тоже выдает ошибку "Cannot assign a TStringList to a TMemoStrings"


 
Digitman ©   (2004-02-02 18:07) [24]

var
listX: TStringList;
begin
listX := List;
try
Memo1.Lines.Text := listX.Text;
finally
listX.Free;
end;
end;


 
Тимохов ©   (2004-02-02 18:13) [25]


> Digitman © (02.02.04 18:07) [24]
> var
> listX: TStringList;
> begin
> listX := List;
> try
> Memo1.Lines.Text := listX.Text;
> finally
> listX.Free;
> end;
> end;


Должно работать Memo1.Lines := listX;

Имхо если у него не работает, то это думаю потому как из DLL приходит битый указатель не пойми куда ...


 
panov ©   (2004-02-02 18:57) [26]

А можно перейти на нормальные именования переменных и функций, не предопределенных в борландовских исходных модулях?



Страницы: 1 вся ветка

Текущий архив: 2004.02.13;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.033 c
7-39113
RealRascal
2003-11-29 22:27
2004.02.13
Звук определенной частоты


9-38661
Sacred
2003-07-31 20:54
2004.02.13
Угол обзора камеры


6-38990
Zilog_
2003-12-10 18:40
2004.02.13
Проблема с WebBrowser~ом


14-39091
@lex
2004-01-21 10:28
2004.02.13
Пингвины - форева


1-38942
Pavel
2004-02-04 09:19
2004.02.13
Глючный Delphi