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

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

Форма в dll. Пытаюсь разобраться


Страницы:   1 2 3 4

EgorovAlex ©   (2010-03-29 13:13:00) 

Есть такой код библиотеки:


library pDll;

uses
 Windows, SysUtils, Classes, Forms,
 uDll;

{$R *.res}

procedure Show(App: TApplication); stdcall;
var
 DllApp: TApplication;
begin
 DllApp := Application;
 Application := App;
 with TForm.Create(Application) do
 try
   ShowModal;
 finally
   Free;
 end;
 Application := DllApp;
end;

exports
 Show;

begin
end.


Вызываю так:
procedure TFormTest.btnTestDllClick(Sender: TObject);
var
 hLib: THandle;
 Show: procedure(App: TApplication); stdcall;
begin
 @Show := nil;
 hLib := LoadLibrary('pDll.dll');
 if (hLib > 0) then
 try
   @Show := GetProcAddress(hLib, 'Show');
   if (@Show <> nil) then
     Show(Application);
 finally
   FreeLibrary(hLib);
 end;
end;


Первый вызов проходит удачно, а после второго клика на баттоне выскакивает аксесс виолейшн. В чём может быть дело? Форма в dll пустая.

Если процедуру создания формы заменить на:

procedure Show(App: TApplication); stdcall;
begin
 with TForm.Create(App) do
 try
   ShowModal;
 finally
   Free;
 end;
end;


То форма создаётся нормально много раз, только форма теперь не по центру главной формы создаётся, а в центре экрана, а это не устраивает (у формы стоит Position := poMainFormCenter)


Leonid Troyanovsky   (2010-03-29 19:30:00) [41]


> Игорь Шевченко ©   (29.03.10 19:06) [21]

> Бред какой-то. Жалко, эксперты руки выпрямить не советуют,
>  это был бы наиболее оптимальный совет.

Конечно, это можно сформулировать проще:
Не используйте dll там, где без них можно обойтись.

Повторное использование кода легко реализовать обычными средствами
дельфи. Скажем, включил себе в проект юнит и пользуй.

А экономить дисковое пространство это не наша задача :)
Все равно, рано или поздно, дело сведется к использованию
для конкретного проекта конкретной библиотеки.

Ну, и поддерживать зоопарк разных версий из разных заповедников
это очень, IMHO, увлекательное и продуктивное занятие.

--
Regards, LVT.


Игорь Шевченко   (2010-03-29 19:06:00) [42]

Leonid Troyanovsky ©   (29.03.10 18:48) [20]


> http://ru.wikipedia.org/wiki/DLL_hell


"DLL hell — пример плохой концепции программирования, которая, подобно скрытой мине, приводит к резкому возрастанию трудностей при усложнении и совершенствовании системы. Поэтому эксперты рекомендуют избегать или ограничивать применение DLL, обуславливающих такого рода конфликты."

Бред какой-то. Жалко, эксперты руки выпрямить не советуют, это был бы наиболее оптимальный совет.


Leonid Troyanovsky   (2010-03-29 18:48:00) [43]


> Игорь Шевченко ©   (29.03.10 18:28) [19]

> Не увидел в статье по ссылке dll considered an evil

Его и не поминали, бо излучали оптимизм.

Мне, кста, комментарий
http://ru.wikipedia.org/wiki/DLL_hellпонравился.

--
Regards, LVT.


Игорь Шевченко   (2010-03-29 18:28:00) [44]

Leonid Troyanovsky ©   (29.03.10 17:53) [18]

Не увидел в статье по ссылке dll considered an evil


Leonid Troyanovsky   (2010-03-29 17:53:00) [45]


> Игорь Шевченко ©   (29.03.10 17:36) [17]

> > Многие считают и dll злом :)

> количество многих равно единице :)

Оптимист :)
http://msdn.microsoft.com/en-us/library/ms811694.aspx

Себя я даже вычеркнуть могу.

--
Regards, LVT.


Игорь Шевченко   (2010-03-29 17:36:00) [46]

Leonid Troyanovsky ©   (29.03.10 17:35) [16]


> Многие считают и dll злом :)


количество многих равно единице :)


Leonid Troyanovsky   (2010-03-29 17:35:00) [47]


> EgorovAlex ©   (29.03.10 15:56) [11]

> А какие ещё подводные камни могут быть потом? Почему многие
> считают формы в dll злом?

Многие считают и dll злом :)

--
Regards, LVT.


Германн   (2010-03-29 16:47:00) [48]


> есть подозрение, что это...

Не. Вышеназванный как правило не тыкает. :)


12   (2010-03-29 16:37:00) [49]

слушай Application
я набил уже шишку. Пока что-то заработает - время уйдет.
потом все работает вроде - оппа! опять что-то не работает. Начинаем искать, находим, а время то не стоит..

короче, слушай Application - есть подозрение, что это ЮЗ :)


EgorovAlex   (2010-03-29 16:03:00) [50]

Сейчас у меня туда только хендл передаётся и выглядит примерно так:


procedure Show(hApp: THandle); stdcall;
begin
Application.Handle := hApp;
with TForm.Create(Application) do
try
  ShowModal;
finally
  Free;
end;
end;


До этого был ещё код запоминания и восстановления исходного хендла, но у Пачеки этого нет и у себя убрал


Сергей М.   (2010-03-29 16:00:00) [51]


> EgorovAlex ©   (29.03.10 15:56) [11]


Ты эту свою dll, насколько это видно из приведенного кода, собираешься использовать не только в дельфийских хост-приложениях ?


EgorovAlex   (2010-03-29 15:56:00) [52]

В общем прочитал я этих Тейкстеру с Пачекой - полезно иногда вспоминать первоисточники оказалось. Сделал как у них: в Application.Handle заношу хэндл экзешника, а выравнивание делаю передачей координат, вроде всё отлично работает :)

А какие ещё подводные камни могут быть потом? Почему многие считают формы в dll злом?


Игорь Шевченко   (2010-03-29 14:58:00) [53]

Тейксейра с Пачеко вроде давно разжевали все с формами в DLL ?


KSergey   (2010-03-29 14:43:00) [54]

> EgorovAlex ©   (29.03.10 14:20) [7]
> по главной не происходит, хотя форма и создаётся. Как выравнивать?

а) передать координаты
б) делать bpl
в) см. [8]


Leonid Troyanovsky   (2010-03-29 14:27:00) [55]


> EgorovAlex ©   (29.03.10 14:18) [6]

> некоторые формы было бы удобно туда кинуть, чтобы потом
> из разным проектов использовать...

Удобно в репозитарий кинуть.

--
Regards, LVT.


EgorovAlex   (2010-03-29 14:20:00) [56]

Я с передачи хендла и начинал, но там выравнивания формы по главной не происходит, хотя форма и создаётся. Как выравнивать?


EgorovAlex   (2010-03-29 14:18:00) [57]

To Application,

Извини, тон не распознал :) Просто всё, что находил в интернете кажется простым и о таких тонкостях вообще никто ничего не говорил, только все говорят, что это очень просто и никаких проблем...

To KSergey,

Почему плохая? Потому-что проблем много? Я просто подумал некоторые формы было бы удобно туда кинуть, чтобы потом из разным проектов использовать...


KSergey   (2010-03-29 14:02:00) [58]

Ааа! вспомнил как это делается! (помню же, что было просто)

Эта, сложного ничего нет. Есть вот что:

1. Судя по uses - используются разные менеджеры памяти у exe и dll, при этом в dll передается ссылка на Application из хост приложения, которе выделено другим менеджером памяти и все такое, а вы изменяете его свойства в ДЛЛ, при этом переаллочируются участки памяти уже другим менеджером памятьи - короче то, что 1 раз срабатывает - тоже случайность чистой воды. Ну т.е. так делать нельзя в принципе.
Да и объекты Application в exe и dll - они разные, хоть и называются одинаково.

2. Если хочется почти все оставитьтак, то надо передавать в dll не Application, а Application.Handle, соответственно изменив тип параметра и в ДЛЛ присвоение тоже делать свойству Application.Handle.
Все срастется.


KSergey   (2010-03-29 13:56:00) [59]

Давайте вы разберетесь с тем, где именно возникает AV (на какой строчке) -а тама уже бум. думать.

В общем и целом - форма в ДЛЛ - неудачная идея.


Application   (2010-03-29 13:56:00) [60]

>Сарказм я конечно понимаю

И где ты увидел в моих словах сарказм?

но всё, что я нашёл крутится вокруг приведённого кода

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

А ты написал:

procedure Show( App: TApplication); stdcall;

exports
Show;


и надеешься, что тебе что-то тут подскажут? Подсказывать нечего, потому что то, то ты написал - писать нельзя. Почему? Потому что RTTI в разных модулях - разная. Добиться, чтобы она была одинаковой, можно, лишь используя пакеты. Не используя пакеты, так, как ты написал - писать нельзя. Надо использовать другие пути. Сложные. Которые тебе никто не расскажет и не разжует, потому что это сложно, и ты не поймешь до тех пор, пока не разберешься с этим сам.

DIXI


Страницы:   1 2 3 4

Наверх

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