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

Вниз

Рисование из DLL на канве цветом   Найти похожие ветки 

 
ssk   (2003-12-19 09:51) [0]

Всем привет! Не получается рисовать из DLL на канве цветом. Вот мой код:

Загрузка процедуры из библиотеки:
type
TWork = procedure (Cnv: TCanvas); stdcall;

var
Lib: THandle;
Work: TWork;

Lib:=LoadLibrary (PAnsiChar("ver2000i.dll"));
try
@Work:=GetProcAddress(Lib, "Work");
if not (@Work=nil) then
Work(Image.Canvas);// <--- здесь выдает ошибку при повторном вызове
finally
FreeLibrary(Lib);
end;


И DLL (лишнее убрано)

library ver2000i;

uses
ShareMem, Graphics;

procedure Work(Cnv: TCanvas); stdcall;
begin
//Cnv.Pen.Color:=clRed; { если раскомментироовать, то access violation }
Cnv.Ellipse(20, 20, 50, 80);
end;

exports
Work;
end.


Теперь вопрос: если строка о присвоении цвета закомментирована, то при последующих вызовах все работает нормально. Но если строку Cnv.Pen.Color:=clRed; раскомментировать, то после второго вызова процедуры Work вылетает access violation (в коде я это место отметил). Как этого избежать и заставить процедуру рисовать цветом? Может я что-то не так делаю? Спасибо.


 
REA ©   (2003-12-19 09:56) [1]

Поскольку классы в DLL и программе разные (RTTI), то могут быть разные непредсказуемые эффекты при передаче классов. А в программе тоже ShareMem первым подключен? Рекомендую линковать с подключенными RTL.


 
ssk   (2003-12-19 10:04) [2]

Да, ShareMem в DPR включен первым.


 
ssk   (2003-12-19 10:06) [3]

Вот начало dpr файла:

program dxf2tap;

uses
ShareMem,
Forms,
main in "main.pas" {mainForm},
tech in "tech.pas" {techForm},


 
REA ©   (2003-12-19 10:14) [4]

@Work:=GetProcAddress(Lib, "Work"); - @ мне кажется здесь лишнее
Вместо (@Work=nil) лучше Assigned(Work).


 
ssk   (2003-12-19 10:23) [5]

>REA © (19.12.03 10:14) [4]

Совет попробовал. К сожалению, не работает совсем. Ошибок нет, но ничего не рисует - отладчик до строки Work(Im.Canvas) не доходит. Теперь еще обнаружилось вот что: если после первого вызова с цветом попытаться закрыть приложение, то тоже вылетает access violation.


 
REA ©   (2003-12-19 10:26) [6]

Assigned употреблять без Not. Все же включи галочку в свойствах проекта Packages->Runtime packages.


 
ssk   (2003-12-19 10:31) [7]

Галочку поставил, Not убрал - все равно вылетает access violation.


 
REA ©   (2003-12-19 10:47) [8]

Галочку и в библиотке и в exe поставил?
Давай тогда код полнее.


 
ssk   (2003-12-19 11:04) [9]

В библиотеке поставил галочку и все заработало. Спасибо. А теперь вопрос такой, возможно ламерский и совсем не в тему: как узнать, какие BPL-файлы к ЕХЕ-файлу нужны? А они, подозреваю, нужны.


 
REA ©   (2003-12-19 11:23) [10]

1) Спец утилитой, секция Imports
2) QuiсkView
3) InstallShield полный, StaticScan
4) Запустить - ругнется, на то, чего нет.


 
ssk   (2003-12-19 11:41) [11]

Спасибо еще раз. Все ОК.



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

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

Наверх




Память: 0.49 MB
Время: 0.02 c
8-12007
Leon Killer
2003-09-02 18:13
2004.01.05
VCL


14-12157
Думкин
2003-12-12 04:57
2004.01.05
С днем рождения! 12 декабря.


1-11922
P.N.P.
2003-12-20 20:54
2004.01.05
TserviceApplication


14-12153
фффффффффффффффф
2003-12-11 19:23
2004.01.05
тесты


3-11841
gestern
2003-12-09 21:26
2004.01.05
sql