Форум: "Основная";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
ВнизПроблема с очисткой памяти Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c