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

Вниз

Ошибка в DLL?   Найти похожие ветки 

 
Sour ©   (2002-02-18 09:12) [0]

Имеется:
1. библиотека(DLL):


library Project2;

uses
SysUtils,
Classes;

type
TMy = record
N: integer;
A: array of integer;
end;

function Get: TMy;
var
Tmp: TMy;
i: integer;
begin
SetLength(Tmp.A, 100);
Tmp.N := -12;
for i := Low(Tmp.A) to High(Tmp.A) do
Tmp.A[i] := Random(100);
Result := Tmp;
end;

exports
Get;

begin
end.


2. Проект


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
TMy = record
N: integer;
A: array of integer;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
Tmp: TMY;
public
{ Public declarations }
end;
function Get: TMy; external "project2.dll"

var
Form1: TForm1;

implementation

{$R *.DFM}


procedure TForm1.Button1Click(Sender: TObject);//Событие на нажатие Button1
begin
Tmp := Get;
end;

end.


Если нажать на кнопку Button1, а потом закрыть программу, то выдается сообщение об ошибке
Invalid pointer operation. Что я сделал не так?


 
MBo ©   (2002-02-18 09:28) [1]

динамический массив -> uses sharemem первым надо писать


 
Sour ©   (2002-02-21 20:13) [2]

Даже если ShareMem в начале uses всех модулей поставить и в рабочий каталог boralndmm.dll кинуть, что на завершение работы программы возникает ошибка Invalid Pointer Operation!!!!


 
MBo ©   (2002-02-22 08:20) [3]

видимо, потому что создаешь дин. массив в одном месте, а при выходе он уничтожается в другом.


 
Digitman ©   (2002-02-22 10:07) [4]

что, по-твоему, происходит в строчке
Result := Tmp;
где Tmp - локальная переменная ?


 
Sour ©   (2002-02-24 21:20) [5]

Ребята, рассуждения на тему где что очищается верны! Т.е. у меня возникло предположение, что динамический массив очищается дважды. Но как этого избежать? Вопрос остается открытым.


 
Набережных С.   (2002-02-24 22:00) [6]

ShareMem нужно ставить первым в файлы проекта DLL и EXE.


 
Sour ©   (2002-02-25 21:51) [7]

ShareMem в файлах первый!!!!


 
Набережных С.   (2002-02-25 22:30) [8]

В файлах с расширением .dpr? Тогда ошибка не в приведенном коде.


 
Набережных С.   (2002-02-25 22:33) [9]

Покажи код.


 
Aleks1   (2002-02-26 01:10) [10]

Блин, хлопцы, почему вы все проигнорировали замечание:
Digitman © (22.02.02 10:07)
Он ведь указал на конкретную ОШИБКУ в приведенном коде?
Результат функции Get присваивается локальной переменной Tmp, которая после выхода из функции теряет смысл!


 
Набережных С.   (2002-02-26 14:41) [11]


> Aleks1 (26.02.02 01:10)

В конструкции Result := Tmp; происходит присваивание значений полей рекорда Tmp полям рекорда Result. То же происходит при Tmp := Get;. Но одно из полей содержит ссылку на область памяти. У DLL и EXE разные менеджеры памяти, ничего не знающие друг о друге - в этом и проблема. Полагаю, это и имел в виду Digitman ©. ShareMem заменяет эти менеджеры собственным, и именно поэтому она должна идти первой в файле проекта(dpr), иначе будут задействованы внутренние менеджеры. Остальные модули проекта не имеют значения. Но, на мой взгляд, лучше вообще забыть о ShareMem и действовать стандартно, самостоятельно выделяя и освобождая память в одном месте(лучше - в EXE).



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

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

Наверх




Память: 0.49 MB
Время: 0.014 c
3-42916
ser_ker
2002-02-14 10:51
2002.03.14
Как заставить программу работать через ODBC без BDE ?


3-42969
Lost
2002-02-15 20:38
2002.03.14
W2kServer + IB тормоза на Update


14-43172
Григорий Ситнин
2002-01-31 12:04
2002.03.14
Хм... Жизненное... =)


14-43135
Black_Angel
2002-01-26 02:05
2002.03.14
Народ, у кого нет высшего образования, и работает програмером?


1-43117
Eraser
2002-02-28 13:05
2002.03.14
создание компонентов в программе