Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];

Вниз

Ошибка в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.004 c
1-43031
SuperIgor
2002-02-22 22:44
2002.03.14
Изображение экрана


14-43147
SoftOne
2002-01-26 03:25
2002.03.14
Браузеры


1-43068
jenbond
2002-02-27 10:03
2002.03.14
шифрование


3-42914
Максимка
2002-02-10 20:17
2002.03.14
Как из DLL использовать OracleSession вызывающей программы?


7-43190
Потерянный
2001-12-03 11:24
2002.03.14
Выключение компьютера





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