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

Вниз

TCanvas, DLL - по ходу не догоняю   Найти похожие ветки 

 
MacroDenS ©   (2004-06-25 15:04) [0]

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

Procedure MyFunc(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:19) [1]


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


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


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


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

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


 
Григорьев Антон ©   (2004-06-25 15:25) [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:32) [3]


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


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

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

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

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



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

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

Наверх




Память: 0.48 MB
Время: 0.023 c
1-1088049555
Vilux
2004-06-24 07:59
2004.07.11
Перехват содержимого ClipBoard


1-1088581790
chistyakov
2004-06-30 11:49
2004.07.11
Процедурные типы.


1-1088167974
BBoost
2004-06-25 16:52
2004.07.11
Управление курсором в Edit е


1-1088220292
Dr.Karter
2004-06-26 07:24
2004.07.11
MDIChild


3-1087298262
Xmen
2004-06-15 15:17
2004.07.11
немогу сохранить фото в базу Oracle