Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.009 c
6-38994
Dark Elf
2003-09-10 12:15
2004.02.13
Работа с почтой


1-38883
dima_shapkin
2004-02-05 11:33
2004.02.13
Отрисовка на холсте


14-39063
J_S
2004-01-24 17:07
2004.02.13
Microsoft.XMLDOM (version 2.0)


4-39125
vladelo
2003-12-10 19:13
2004.02.13
Hook на подключение к Internet


1-38916
Bizz
2004-02-05 09:43
2004.02.13
Сборник статей на Дельфи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский