Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как передать TGraphic из DLL в программу [D7, Win95/98, WinXP]


Страницы:   1 2

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]

а хэндл?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо