Форум: "Начинающим";
Текущий архив: 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.005 c