![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как передать TGraphic из DLL в программу [D7, Win95/98, WinXP]
killer © (2004-06-27 03:04:00)Как можно передать TGraphic из DLL в программу?
я делаю так, но вылитает ошибка постоянно...
в форме DLL:
function ShowFormView(Handle: HWnd; Img: TGraphic): TGraphic; stdcall;
var
Form1: TForm1;
begin
Application.Handle:=Handle;
Form1:=TForm1.Create(Application);
Form1.Image1.Picture.Graphic:=Img;
Form1.ShowModal;
Result:=Form1.Image1.Picture.Graphic;
Form1.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
begin
Image1.Picture.Graphic.LoadFromFile(OpenPictureDialog1.FileName);
end;
end;
в программе:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
View: LongWord;
ShowFormView: function(Handle: HWnd; Img: TGraphic): TGraphic; stdcall;
begin
View:=LoadLibrary('View.dll');
if View=0 then
begin
Application.MessageBox('The library View.dll is not found.', 'Error', mb_IconStop+mb_Ok);
end
else
begin
@ShowFormView:=GetProcAddress(View,'ShowFormView');
Image1.Picture.Graphic:=ShowFormView(Application.Handle, Image1.Picture.Graphic);
FreeLibrary(View);
end;
end;
Помогите пожалуйста...
killer (2004-07-01 17:16:00) [1]Может сделать форму DLL которая модулем... и не париться...?
killer (2004-07-01 02:19:00) [2]Если в программе написать:
ShowFormView(Application.Handle, Image1.Picture.Graphic);
не компилируется... пишет что этот параметр только для чтения... и что делать?
killer (2004-07-01 02:05:00) [3]ГаврилаИзвени... я что-то не очень понял...
Гаврила (2004-07-01 01:25:00) [4]Блин !!!!
никогда не объявляйте в бибилиотеке параметрами указатели на VCL экхемпляр-класса !!!!
НИКОГДА !
Ни входными, ни выходными
это неправильно
killer (2004-07-01 00:43:00) [5]??? :(((
killer (2004-06-30 16:54:00) [6]Help
killer (2004-06-30 15:11:00) [7]Убрал я функцию FreeFormView... теперь еще какая-то ошибка...:(
killer (2004-06-30 14:24:00) [8]А сама форма в DLL, которая удаляется??? Каким образом, если мы ее не удалили?
Digitman (2004-06-30 09:10:00) [9]
> Почему?
потому что в теле ф-ции FreeFormView() происходит обращение к несуществующему уже объекту класса TForm1, ссылка на который осталась в виде "мусора" в переменной Form1
killer (2004-06-30 02:25:00) [10]В принципе у меня получилось...
Форма в DLL:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Jpeg, ExtDlgs, StdCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
OpenPictureDialog1: TOpenPictureDialog;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
procedure ShowFormView(Handle: HWnd; var Img: TGraphic); export;
procedure FreeFormView; export;
implementation
{$R *.dfm}
procedure ShowFormView(Handle: HWnd; var Img: TGraphic); export;
begin
Application.Handle:=Handle;
Form1:=TForm1.Create(Application);
Form1.Image1.Picture.Graphic:=Img;
Form1.ShowModal;
Img:=Form1.Image1.Picture.Graphic;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
begin
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
procedure FreeFormView; export;
begin
Form1.Free;
end;
end.
Программа:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtDlgs, XPMan, StdCtrls, Buttons, ExtCtrls, Jpeg;
type
TForm1 = class(TForm)
Image1: TImage;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
XPManifest1: TXPManifest;
OpenPictureDialog1: TOpenPictureDialog;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject); // Open
begin
if OpenPictureDialog1.Execute then
begin
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var
View: LongWord;
ShowFormView: procedure(Handle: HWnd; var Img: TGraphic); stdcall;
FreeFormView: procedure; stdcall;
Gr: TGraphic;
begin
View:=LoadLibrary('View.dll');
if View=0 then
begin
Application.MessageBox('The library View.dll is not found.', 'Error', mb_IconStop+mb_Ok);
end
else
begin
@ShowFormView:=GetProcAddress(View,'ShowFormView');
@FreeFormView:=GetProcAddress(View,'FreeFormView');
Gr:=TGraphic.Create;
Gr:=Image1.Picture.Graphic;
ShowFormView(Application.Handle, Gr);
Image1.Picture.Graphic:=Gr;
Gr.Free;
FreeFormView;
FreeLibrary(View);
end;
end;
end.
Все передается... Только вот почему-то на функции FreeFormViewвозникает ошибка. Почему?
killer (2004-06-28 20:42:00) [11]точно...... значит наверно никак нельзя передать......
KilkennyCat (2004-06-28 08:38:00) [12]
> Digitman © (28.06.04 08:25) [18]
и действительно...
мда... пойду курить.
Digitman (2004-06-28 08:25:00) [13]> Result:=Form1.Image1.Picture.Graphic;
> Form1.Free; //здесь наряду с "убийством" формы происходит и "убийство" объекта Graphic, и в результате возвращяется не ссылка на объект, а "мусор"
killer (2004-06-28 08:12:00) [14]KilkennyCatХорошо :)
KilkennyCat (2004-06-28 07:38:00) [15]
> killer © (28.06.04 07:02) [15]
я вечером освобожусь - попробую.
killer (2004-06-28 07:02:00) [16]Что-то у меня до сих пор ничего не получается........ :((
killer (2004-06-28 01:50:00) [17]я думаю от этого хендла ничего не зависит...
killer (2004-06-28 01:49:00) [18]Это для того, чтобы форма, которая в DLL, чтобы не выводилась на панели задачь в отдельном окне...
KilkennyCat (2004-06-28 01:48:00) [19]а блин, че-то я вообще запутался :)
KilkennyCat (2004-06-28 01:46:00) [20]а хэндл?