Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TCanvas, DLL - по ходу не догоняю [D6, Win95/98, WinXP]


MacroDenS ©   (2004-06-25 15:04:00) 

Доброго времени суток.
Уважаемые Хенделы (помниться некоторое время назад была такая фича, что всех будем звать Хенделами)
Возникла такая трабла.
У меня есль ДЛЛ, в которой есть эспор.процедура:

ProcedureMyFunc(output:TCanvas); stdcall;
Begin
......
//Далее простейшая отрисовка изпользующя moveto, lineto и
//textuot
.....
end>;

exports
   MyFunc;


begin
end.


Далее в проекте загружаю ДЛЛ и вызываю функцию

.....
var
  lib:THandle;
  MyFunc:procedure (output:TCanvas); stdcall;
.....

procedure TForm1.FormCreate(Sender: TObject);
begin
 //Загружаю ДЛЛ и процедуру
  lib:=loadLibrary('paintdll.dll');
  if lib <> 0 then
     MyFunc:=GetProcAddress(lib, MyFunc')
  else begin
     showmessage('Не могу загрузить ДЛЛ');
     close;
  end;
end;

//вызов процедуры
procedure TForm1.Button1Click(Sender: TObject);
begin
  MyFunc(Image1.Canvas);
end;

//и при закрытии проекта
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  freelibrary(lib);
end;

Так вот, ДЛЛ грузится нормально, процедура работает, а вот при закрытии возникает трабла (уже после освобождения памяти под ДЛЛ, которая проходит без ошибок).
Вылазит сообщение:

Excetpion EAccessViolation in module 'Project1.exe' at address <такой-то>
Access violation at <такой-то> in module 'Project1.exe'.
Write of address <такой-то>


Я так понял, что где-то неправильно память освобождается...
Кто-низь знает в чем прикол?
Плиз хелп.
Заранее благодарен.


Digitman   (2004-06-25 15:32:00) [1]


> Григорьев Антон ©   (25.06.04 15:25) [2]
> Лучше забыть про передачу классов в dll


чавой-то вдруг забыть ?

а ну как автор лепит  хост-приложения и ДЛЛ-"примочки" к ним исключительно в одной и той же версии Делфи ?

В сем случае, не вдаваясь в подробности, можно указать автору на простейшее решение - лепить все свои проекты с опцией Build With Run-Time Packages

хуже будет иной вариант  - шаровый менеджер памяти везде (во всех проектах своих) тыкать - нахрена оно нужно равно как и непонятно без поллитры после шокирующего исключения


Григорьев Антон   (2004-06-25 15:25:00) [2]

Лучше забыть про передачу классов в dll и делать так:

procedure MyFunc(CanvHandle:THandle);
var Canvas:TCanvas;
 begin
  Canvas:=TCanvas.Create;
  Canvas.Handle:=CanvHandle;
  // Рисуем всё, что нужно
  Canvas.Handle:=0;
  Canvas.Free
 end;


Digitman   (2004-06-25 15:19:00) [3]


> фича.. всех будем звать Хенделами


сам ты "хендел" !


> at address <такой-то>


вот тот кто не "хендел", тот обычно воспринимает этот самый <такой-то>как важную информацию для поиска источника исключения средствами встроенного отладчика

ты, хендел, возьми-ка лупу и разгляди как следует меню "Search->find error.." и справочку при нем ... оно полезно будет .. для "хендела"


Наверх

Титульная страница Поиск, карта сайта Написать письмо