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-06-28 01:40:00) [21]

А у меня не так же? :)


KilkennyCat   (2004-06-28 01:30:00) [22]

Image1.Picture.Graphic:=ShowFormView(Application.Handle, Image1.Picture.Graphic);

а почему так?

Может, стоит попробовать так:

http://www.delphimaster.ru/articles/usedll/index.html
пример 2


killer   (2004-06-28 01:11:00) [23]

KilkennyCatЭто в книге по програмированию??? Что-то нету тут... :(


KilkennyCat   (2004-06-28 00:18:00) [24]

ну ежели обмениваться памятью, то полезно про мьютексы почитать...


killer   (2004-06-27 23:58:00) [25]

Нужно DLL...


VMcL   (2004-06-27 23:56:00) [26]

>> Vitalik  (27.06.04 11:13) [1]

> Происходит из-за того, что ты работаешь в двумя программами, и у каждой своя область памяти, которые никак не пересекаются. Одна прога - это твой exe-файл, а другая - dll.

Это что-то новое в Win32.

>> killer ©  (27.06.04 03:04)

Используй packages (BPL).


killer   (2004-06-27 23:40:00) [27]

Может через поток какнибудь???


killer   (2004-06-27 17:07:00) [28]

Удалено модератором


killer   (2004-06-27 17:03:00) [29]

Добавил я модуль ShareMem и в программу и в форму DLL... теперь в фоме DLL при открытии изображения возникает, и ничего не открывается...


Vitalik   (2004-06-27 11:13:00) [30]

Ну почему так происходит - могу сказать. Как исправлять - только предположения.

Происходит из-за того, что ты работаешь в двумя программами, и у каждой свояобласть памяти, которые никак не пересекаются. Одна прога - это твой exe-файл, а другая - dll. В exe у тебя находится в памяти объект TGraphic и на него ссылается четырёхбайтовый указатель - Image1.Picture.Graphic. Вот эти 4 байта ты и передаёшь в библиотеку. В библиотеке они успешно принимаются и строка
Form1.Image1.Picture.Graphic:=Img;
устанавливает свой указатель, на тот же адрес, но уже в своейобласти памяти. А что может находится в памяти библиотеки по данному адресу? Да всё, что угодно, но только не то что тебе нужно! А тебе нужен объект TGraphic.

Такая фишка, кстати, имеет место быть и в случае, когда ты передаёшь в DLL длинные строки, которые тоже являются указателями. Вообще, если ты передаёшь в DLL указатель, то ты должен всегда об этом помнить! И понимать, что в DLL указателю указывать как бы и не на что :)

Ну а выход - использовать диспетчер памяти из модуля ShareMem. Но тут я тебе уже не помошник, т.к. я в этом вопросе чистый теоретик :)
Кстати, когда ты делаешь в Delphi "File->New->Other..." и выбираешь "DLL Wizard" то в новом файле автоматически пишется комментарий про использование ShareMem...


Страницы:   1 2

Наверх

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