Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.034 c