Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.04;
Скачать: CL | DM;

Вниз

Единый TApplications для Dll и Exe без Bpl   Найти похожие ветки 

 
Gu   (2011-08-09 06:43) [0]

В большинстве источников в инете пишут, что при инициализации Dll из приложения необходимо передать в эту dll TApplication и TScreen приложения (последний кстати некоторые советуют не использовать, т.к. это приводит к ошибкам типа cannot assign tfont to tfont в модуле graphics). Но все равно при этом одного tApplication не получится, т.к. приложение и dll используют разные экземпляры tapplication и это приводит к куче проблем и лечить это советуют только сборкой длл и ехе на одной версии дельфей с включением рантайм пакетов (bpl), но это очень неудобно, т.к. с приложением все эти пакеты надо таскать.

Вот тут есть интересный пример одного китайца(?), как получить типа общего control для приложения и длл через атомы (общий контрол.пас): http://hi.baidu.com/buckayro/blog/item/c93259f1357bfbc47931aab0.html

Может еще какие способы есть и кто что об этом думает, может в новых версиях дельфей что то новое появилось, чтобы  это реализовать (%тема вопроса%)? Читал еще, что можно както типа мини api внедрять в приложение, но реализации не видел. Буду благодарен за любые идеи.


 
Gu   (2011-08-09 07:21) [1]

это я к тому, что как бы сделать, чтобы код в dll

..
var p:tpanel;
begin
Application.MainForm.Caption:="test";
p:=tpanel.create(Application.MainForm);
p.ParentFont:=false;
p.Parent := Application.MainForm;
p.Top:=0;
p.Left:=0;
p.Caption:=Application.MainForm.Caption;
p.Width:=200;
p.Height:=200;
p.Color:=clred;
p.Visible:=true;

выполнылся бы и без компиляции dll и exe вместе с bpl (он работает, но только если с рантайм пакетами собирать, а так нет, хотя название формы меняется на test)


 
Ega23 ©   (2011-08-09 08:05) [2]

Зачем dll нужно что-то знать о главной форме?


 
Anatoly Podgoretsky ©   (2011-08-09 08:53) [3]


> т.к. с приложением все эти пакеты надо таскать.

Как будто ДЛЛ не надо таскать.


 
Ega23 ©   (2011-08-09 09:03) [4]

Я вот совершенно не понимал, откуда это маниакальное желание запихнуть всё на свете в dll?


 
OW ©   (2011-08-09 10:41) [5]

делали так
у всех dll есть одна стандартная функция, которая спрашивает все что нужно
TApplication  TScreen, еще что-то (TConnrection)
Загрузил и передал.

И все равно глюканет ^)


 
Gu   (2011-08-09 11:36) [6]

>> у всех dll есть одна стандартная функция

ну да, эти параметры при инициализации передаются. только после приравнивания их локальным экземпляры все равно разные.


 
Игорь Шевченко ©   (2011-08-09 12:36) [7]

Читать Тейксейру с Пачеко, о том, как работать с формами в DLL без пакетов


 
Anatoly Podgoretsky ©   (2011-08-09 13:17) [8]

> Ega23  (09.08.2011 09:03:04)  [4]

Чешется


 
Andy BitOff ©   (2011-08-09 13:19) [9]

А что, dll ща модно? Особенно те, которые должны знать о том, кто и загрузил?


 
QAZ   (2011-08-09 13:24) [10]


> Зачем dll нужно что-то знать о главной форме?


> А что, dll ща модно? Особенно те, которые должны знать о
> том, кто и загрузил?

афтар видимо изобретает щикарную систему плагинов


 
DiamondShark ©   (2011-08-10 16:34) [11]


> Ega23 ©   (09.08.11 09:03) [4]
> Я вот совершенно не понимал, откуда это маниакальное желание
> запихнуть всё на свете в dll?

Модульность, однако.

1. Можно собирать рабочие места без лишнего функционала. Например, кладовщику не нужны модули аналитики, а менеджеру по продажам не нужны модули выписки заборных листов и печати транспортных этикеток.

2. Можно оперативно обновлять багофичи. Например, для исправления очепятки в форме выписки кассового ордера надо скопировать только модуль "Касса" размером триста килобайт, а не монолитный ехешник на сорок пять мегабайт.

3. Можно динамически расширять функционал, добавляя модули, которых раньше не было в системе. Опть же, не перекомпиливая весь монстроузный проект и не пересылая весь стопицотгигабайтный инсталяционный пакет.

...

N. PROFIT!!!

Хотя, таки да, пакеты для модульности удобнее.
А ещё лучше не страдать пассивной некрофилией, и переходить на дотНЕТ.


 
QAZ   (2011-08-11 11:13) [12]


> переходить на дотНЕТ

чтобы получать

> ехешник на сорок пять мегабайт

и

> стопицотгигабайтный инсталяционный пакет

?


 
_Юрий   (2011-08-11 19:45) [13]


> QAZ   (11.08.11 11:13) [12]


С точностью до наоборот


 
Германн ©   (2011-08-12 01:12) [14]


> DiamondShark ©   (10.08.11 16:34) [11]
>
>
> > Ega23 ©   (09.08.11 09:03) [4]
> > Я вот совершенно не понимал, откуда это маниакальное желание
> > запихнуть всё на свете в dll?
>
> Модульность, однако.
>
> 1. Можно собирать рабочие места без лишнего функционала.
>

А собирать-то кто будет?
А в конце-концов всё это дерьмо придётся разгребать техподдержке. :(
Прям как в анекдоте про сантехников. :)


 
Дмитрий Белькевич   (2011-08-12 09:34) [15]

Монолитный экзешник - минимум головной боли для техсаппорта и для юзеров. А кого сейчас удивишь 45-ю мегабайтами? Такой экзешник, кстати, еще нужно попробовать сделать...


> переходить на дотНЕТ


Ага, причем на последнюю версию. И таскать с собой 300 метров "счастья". Для каждого калькулятора.


 
Ega23 ©   (2011-08-12 09:40) [16]


> Такой экзешник, кстати, еще нужно попробовать сделать...


Ну если обфускатор натравить, то легко.

А активное использование dll - это разве только в системе плагинов, это я понять могу.


 
han_malign   (2011-08-12 09:41) [17]


> передать в эту dll TApplication и TScreen

- в DLL надо передавать Application.Handle, при присваивании которого второму экземпляру Application тот аттачится к первому и все путем(почти)...

Forms.pas:
procedure TApplication.SetHandle(Value: HWnd);
begin
 if not FHandleCreated and (Value <> FHandle) then
 begin
   if FHandle <> 0 then UnhookMainWindow(CheckIniChange);
   FHandle := Value;
   if FHandle <> 0 then HookMainWindow(CheckIniChange);
 end;
end;
.................................
procedure TApplication.WndProc(var Message: TMessage);
   .............................  
   for I := 0 to FWindowHooks.Count - 1 do
     if TWindowHook(FWindowHooks[I]^)(Message) then Exit;
     ..........................
       CM_WINDOWHOOK:
         if wParam = 0 then
           HookMainWindow(TWindowHook(Pointer(LParam)^)) else
           UnhookMainWindow(TWindowHook(Pointer(LParam)^));

.................................
procedure TApplication.HookMainWindow(Hook: TWindowHook);
var
 WindowHook: ^TWindowHook;
begin
 if not FHandleCreated then
 begin
   if FHandle <> 0 then
     SendMessage(FHandle, CM_WINDOWHOOK, 0, Longint(@@Hook));
 end else
 begin
   FWindowHooks.Expand;
   New(WindowHook);
   WindowHook^ := Hook;
   FWindowHooks.Add(WindowHook);
 end;
end;


 
han_malign   (2011-08-12 09:54) [18]


> только после приравнивания их локальным экземпляры все равно разные.

- экземпляры одинаковые - код дублируется, но "инлайнирование кода" вроде не считается тяжким грехом...
А вот если менеджеры памяти разные(пресловутый ShareMem) - тады может быть ой...

Ну и естественно надо помнить, что это не последние глобальные переменные в VCL...


 
han_malign   (2011-08-12 10:09) [19]


> (пресловутый ShareMem)

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


 
Игорь Шевченко ©   (2011-08-12 10:42) [20]


> Монолитный экзешник - минимум головной боли для техсаппорта
> и для юзеров


Расскажи это Microsoft, Oracle, Borland-CodeGear-Embarcadero, они будут приятно удивлены


 
Dennis I. Komarov ©   (2011-08-12 10:51) [21]

В длл надо выносить отдельные, логически завершенные, подпрограммы. Например модуль криптографии, некий GUI который можно будет юзать посторонним софтом и т.п.
ИМХО


 
DiamondShark ©   (2011-08-12 11:01) [22]


> Германн ©   (12.08.11 01:12) [14]
> А собирать-то кто будет?

Можно подумать, вы ни одного инсталятора с выбором компонентов не видели.
Наверное, даже МС Офис ни разу в жизни не ставили.


 
Anatoly Podgoretsky ©   (2011-08-12 17:00) [23]

> Дмитрий Белькевич  (12.08.2011 09:34:15)  [15]

Word 2003 - 12 мегабайт, так это Ворд


 
Дмитрий Белькевич   (2011-08-13 19:10) [24]


> Расскажи это Microsoft, Oracle, Borland-CodeGear-Embarcadero,
>  они будут приятно удивлены


Угу, помню - помню - эмбеддид борландовский вместо одного экзешника (или дллки) - гора дллок и манифестов, которые на разных операционках по-разному не работают.


 
Дмитрий Белькевич   (2011-08-13 19:13) [25]

Устали от багрепортов... Но - вроде удалось комбинацию безглючную найти. Это только то, чего касаемся. К счастью, работу с вордом и эксплорером удалось выкосить из софта.


 
Германн ©   (2011-08-14 00:32) [26]


> DiamondShark ©   (12.08.11 11:01) [22]
>
>
> > Германн ©   (12.08.11 01:12) [14]
> > А собирать-то кто будет?
>
> Можно подумать, вы ни одного инсталятора с выбором компонентов
> не видели.
> Наверное, даже МС Офис ни разу в жизни не ставили.
>

Не важно что видел я. Не обо мне речь. А о "кладовщиках". Да и о менеджерах тоже. :)


 
Gu   (2011-08-14 01:30) [27]

2 han_malign

не могли бы вы залить куданить небольшой рабочий пример, из вашего кода [17] мне не совсем ясно что там и как (или хотябы полнее привести код модуля инициализации в длл, т.к. неясно откуда там берется tapplication). И после этих манипуляций на основном окне приложения можно будет создать панель (из dll, как спрашивал в начале)?


 
DiamondShark ©   (2011-08-15 13:08) [28]


> Не обо мне речь. А о "кладовщиках". Да и о менеджерах тоже.  :)

Кладовщик по е-мылу получает ссылку на ClickOnce инсталяцию, тыкает в неё, и больше на горизонте не возникает.



Страницы: 1 вся ветка

Текущий архив: 2011.12.04;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.009 c
2-1313573567
2012
2011-08-17 13:32
2011.12.04
Проблема с чтением нетипизированного файла


15-1313057260
antonn (work)
2011-08-11 14:07
2011.12.04
Баннер справа


1-1274792222
ford
2010-05-25 16:57
2011.12.04
текст из PDF матрица текста


2-1313070866
лекс01
2011-08-11 17:54
2011.12.04
создание категорий меню и размещение компанентов


15-1312916966
Petr V. Abramov
2011-08-09 23:09
2011.12.04
carrier planning