Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.12.04;
Скачать: [xml.tar.bz2];

Вниз

Единый 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.004 c
2-1313560814
Oleg_teacher
2011-08-17 10:00
2011.12.04
Взаимодействие ворд+делфи


1-1276083003
Омлет
2010-06-09 15:30
2011.12.04
TDateTimePicker - ввод максимальной даты с клавиатуры


15-1312576193
Юрий
2011-08-06 00:29
2011.12.04
С днем рождения ! 6 августа 2011 суббота


2-1313573372
K0nstantin
2011-08-17 13:29
2011.12.04
ClientDataSet1.ApplyUpdates()


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский