![]() |
| ||
|
|
Новости |
Поиск |
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-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...