Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
1-74209
delphin111
2003-10-09 23:09
2003.10.23
Miocrosoft Office


6-74357
Веньтель
2003-08-25 22:54
2003.10.23
Программно запретить доступ к сетке некоторых машин


6-74338
iWorm
2003-08-27 03:11
2003.10.23
И снова сокеты


14-74438
ИМХО
2003-10-03 18:38
2003.10.23
Перевести звук в MP3


7-74491
MoRT
2003-08-10 20:15
2003.10.23
Работа с памятью и указателями





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