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

Вниз

Проблема с очисткой памяти   Найти похожие ветки 

 
Besarion   (2003-10-12 02:30) [0]

здравствуйте уважаемые

Задача: Нужно заполнить известным способом таблицу типа TStringGrid
значениями из листа типа TWideStrings. Оба эти обьекта находятся в главной
программе, а действие (т.е. заполнение таблицы) осуществляется через dll.
Для этого в dll реализована процедура, которой передаётся таблица и лист.

Проблема: Всё работает на ура, но при закрытии программы возникает ошибка
Access violation. Дело не в WideString-ах. еак как та же самая ошибка
генерируется и в случае Array of integer. Что-то не так в механизме очистки.


Заранее благодарен

Besarion

Вот исходники :

=================== вызывающая программа
==========================================
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TntStdCtrls, WSDLIntf, Grids, TntGrids;

type
TForm1 = class(TForm)
Button1: TButton;
SG: TStringGrid;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }

public
{ Public declarations }
end;
procedure FillGrid(AGrid: TStringGrid; AValues: TWideStrings); external
E:\Dll\Test.dll";
var
Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i,j: Integer;
ValueList: TWideStrings;
begin
ValueList := TWideStrings.Create;
for i := 0 to 29 do
ValueList[i] := IntToStr(i);
FillGrid(SG,ValueList);
ValueList.Free;
end;

end.

=================================== DLL ====================================

library Test;

uses
SysUtils,
Classes,
TntGrids,
WSDLIntf;

procedure FillGrid(AGrid: TStringGrid; AValues: TWideStrings);
var
i,j: Integer;
begin
AGrid.RowCount := 2;
for i := 0 to AGrid.ColCount - 1 do
AGrid.Cells[i,1] := "";
i := 0;
while i < AValues.Count do
begin
Inc(i);
for j := 0 to AGrid.ColCount - 1 do
begin
AGrid.Cells[j,AGrid.RowCount-1] := AValues[i];
Inc(i);
end;

AGrid.RowCount := AGrid.RowCount + 1;
end;

if AGrid.RowCount > 2 then
AGrid.RowCount := AGrid.RowCount -1;
end;


{$R *.res}

exports
Hello,
FillGrid;

begin
end.


 
Palladin ©   (2003-10-12 02:54) [1]

Вообще говоря при работе с dll лучше не оперировать классами и объектами, а ограничится передачей строк и простых типов данных...

Хотя ошибка может быть и не в этом, в одном ты прав, AV при закрытии приложения обычно происходит при не корректном освобождении ресурсов, но не обязательно в приведенном тобой коде.


 
Besarion   (2003-10-12 04:15) [2]

А что же можно сделать? хотелось бы чтобы процедуры такого типа работали......


 
Anatoly Podgoretsky ©   (2003-10-12 07:31) [3]

А где ShareMem?
Ты когда создавал DLL там был комментарий, куда подевал?
Какова необходимость в использовании DLL?


 
Besarion   (2003-10-12 11:41) [4]

Насколько я понял - при работе с WideString-ами нет необходимости в использовании ShareMem. Там где передача данных String-ом вызывает ошибку, WideString работает без проблем. Хотя я добавлял uses ShareMem - не помогает.

Необходимость есть - очень часио в различных поректах приходится писать одиаковый код. Можно конечно и в отдельный unit писать, но Dll удобен тем, что можно использовать только те процедуры, в которых есть нужда, ну да не мне говорить Вам об этом :))


 
Юрий Федоров ©   (2003-10-12 12:00) [5]

ShareMem все равно нужен, поскольку ты выделяешь память в DLL, которая затем будет освобождаться в Exe.
Объекты опять же передавать не стоит...
ИЛИ BwRTP включить...



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

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

Наверх




Память: 0.48 MB
Время: 0.024 c
14-74424
ИМХО
2003-10-05 10:02
2003.10.23
Кто помнит песню и исполнителя?


1-74196
KSergey
2003-10-10 09:39
2003.10.23
Про передачу массивов в ф-цию и т.д.


3-74055
noiza
2003-10-03 17:43
2003.10.23
Interbase И


3-74015
zxc
2003-10-03 16:11
2003.10.23
как создать файл *.mdb через ado?


14-74441
ИМХО
2003-10-04 09:24
2003.10.23
---|Ветка была без названия|---