Главная страница
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.032 c
4-12210
h0use
2003-11-04 12:13
2004.01.05
Создать невидимую форму реально?


1-11847
cat
2003-12-18 16:37
2004.01.05
Как писать в компонентах Delphi на различных языках.


7-12171
Step[B.M.]
2003-10-26 00:40
2004.01.05
Нумерация каждого Божего листа при печати


3-11793
Vick
2003-12-08 18:07
2004.01.05
Ошибка в ХП при закрытии и выполнении Select * FROM OPENROWSET...


3-11837
koks
2003-12-04 10:01
2004.01.05
Вопрос к спецам по QuantumGrid4