Форум: "Основная";
Текущий архив: 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