Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при закрытии формы. Освобождение памяти, Access violation at address 
:(
    Опции темы
LessNik
Дата 26.2.2006, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Почему возникает ошибка при закрытии формы и как её устранить?
При закрытии формы возникает ошибка Access violation at address и
только тогда, когда до этого была вызвана функция Compile из DLL, которая
заполнила динамический массив TextProg типа MCommands.
Пробовал очищать память при помощи Finalize(TextProg),nil,FreeMem - безрезультатно!
Помогите разобраться. Уже нет никаких идей! Ниже код проги и DLL.

Код
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TOperand = record
    adr : 0..4;
    value : Word;
  end;

  Commands = record
    Name : string[8];
    Operand1: TOperand;
    Operand2: TOperand;
  end;
  MCommands=array of Commands;

  TCompile=function(Code : TStrings; var TP: MCommands; var LenTP:integer):Cardinal; stdcall;
var
  Form1: TForm1;
  TextProg : MCommands;
  LenTP : integer;
  DLLName : array[0..200] of char;
  Compile : TCompile;
  hDLLInst : THandle;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
     s:string;
begin
  if OpenDialog1.Execute then
  begin
    s:=OpenDialog1.FileName;
    StrPCopy(DLLName,s);
    hDLLInst:=LoadLibrary(DLLName);
    @Compile:=GetProcAddress(hDLLInst,'Compile');
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
     e:Cardinal;
     C : TStrings;
begin
  e:=Compile(C,TextProg,LenTP);
  Form1.Caption:=IntToStr(e);
  FreeLibrary(hDLLInst);
end;
end.


Текст DLL

Код
library MyDLL;

uses
  SysUtils,
  Classes,
  Unit1 in '..\unit1.pas';

{$R *.res}

function Compile(Code : TStrings; var TP: MCommands; var LenTP:integer):Cardinal; export; stdcall;
begin
  LenTP:=1;
  SetLength(TP,LenTP);
  with TP[0] do
  begin
    Name:='yyy';
    Operand1.adr:=3;
    Operand1.value:=$0F;
    Operand2.adr:=4;
    Operand2.value:=0;
  end;
  Compile:=5;
end;
exports
  Compile;
end.

PM MAIL   Вверх
Foley
Дата 26.2.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фсемба Яцца
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 31.1.2006
Где: Россия, Арх.обл

Репутация: 2
Всего: 7



DLL в Uses добавь...(вроде так)
PM MAIL ICQ   Вверх
Quadr0
Дата 27.2.2006, 00:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 10:10
  Вверх
LessNik
Дата 2.3.2006, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



Хорошо конечно, форма закрывается без ошибок. Но вот мне бы хотелось использовать
данные, занесённые DLL-кой в Arr:MCommands, в основной программе в TextProg:MCommands. И что-то у меня снова не получается без
Access violation at address smile. В ТехtProg - пустота.
Данные туда не попали, а как я понял, должны были, ведь передали в Pnt адрес TextProg, а в dll связали Arr:=TP^ и заполнили. В procedure TForm1.Button2Click(Sender: TObject); после e := Compile(C, Pnt, LenTP); подписываю Caption:=Pnt^[0].Name - и снова Access violation at address.
В моей версии проги всё заполнялось отлично и она работала стабильно до закрытия
проги. Может я что-то не подписал? Как получить заполненный TextProg? Помогите.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0422 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.