![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL BCB из Дельфи [D6]
Drowsy © (2009-02-17 19:05:00)Из DLL написанной в ВСВ (C_GRAPH_DDL.dll) экспортируется процедура
// ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
void __declspec(dllexport) __stdcall DrawLiks(TGraphicControl * TPB)
// Нарисовать объект в указанных координатах
// ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
{
TCanvas *PBC = NULL;
TPaintBox *PB = dynamic_cast<TPaintBox *>(TPB);
if(PB)
{
PBC = PB->Canvas;
}
else
{
TImage *PI = dynamic_cast<TImage *>(TPB);
if(PI)
{
PBC = PI->Canvas;
}
}
if (PBC){
// что-то рисуется...
}
}
Если вызывать её из программы на ВСВ, то всё нормально, а если
из Дельфи, где
type
TForm1 = class(TForm)
Button1: TButton;
PntBox : TPaintBox;
Panel1 : TPanel;
...
end;
procedure DrawLiks(TPB : TGraphicControl); stdcall;
external 'C_GRAPH_DDL.dll' name '@DrawLiks$qqsp24Controls@TGraphicControl';
procedure TForm1.Button1Click(Sender: TObject);
begin
DrawLiks(PNTBox);
end;
то экспортируемая процедура не распознаёт PntBox, как TPaintBox.
Как исправить?
Спасибо!
Drowsy (2009-02-18 15:40:00) [1]С хендлом ничего не понял, но заработало... :)
Василий, огромное спасибо! Будешь в Санкт-Петербурге - ставлю коньяк!
Drowsy (2009-02-18 14:31:00) [2]Если так,
>
> // ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
> void __declspec(dllexport) __stdcall DrawLiks(HDC H) // не THandle, а HDC
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
то DLL и прога на Дельфи компилируется и работает, но на канвасе ничего не вырисовывается.
Drowsy (2009-02-18 12:56:00) [3]
>
> TCanvas *PBC = new TCanvas;
> PBC->Handle = H;
Компилятор ругается :
[C++ Error] En_draw.cpp(66): E2034 Cannot convert 'unsigned int' to 'void *'
icWasya (2009-02-18 10:07:00) [4]И не будет, поскольку RTTI у приложения и DLL разные.
Лучше свё-таки так
// ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
void __declspec(dllexport) __stdcall DrawLiks(THandle H)
// Нарисовать объект в указанных координатах
// ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
{
TCanvas *PBC = new TCanvas;
PBC->Handle = H;
if (PBC){
// что-то рисуется...
}
}
и
type
TForm1 = class(TForm)
Button1: TButton;
PntBox : TPaintBox;
Panel1 : TPanel;
...
end;
procedure DrawLiks(THandle H); stdcall;
external 'C_GRAPH_DDL.dll' name '@DrawLiks$qqsp24Controls@TGraphicControl';
procedure TForm1.Button1Click(Sender: TObject);
begin
DrawLiks(PNTBox.Canvas.Handle);
end;