![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Единый TApplications для Dll и Exe без Bpl
Gu © (2011-08-09 06:43:00)В большинстве источников в инете пишут, что при инициализации 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 внедрять в приложение, но реализации не видел. Буду благодарен за любые идеи.
DiamondShark (2011-08-15 13:08:00) [1]
> Не обо мне речь. А о "кладовщиках". Да и о менеджерах тоже. :)
Кладовщик по е-мылу получает ссылку на ClickOnce инсталяцию, тыкает в неё, и больше на горизонте не возникает.
Gu (2011-08-14 01:30:00) [2]2 han_malign
не могли бы вы залить куданить небольшой рабочий пример, из вашего кода [17] мне не совсем ясно что там и как (или хотябы полнее привести код модуля инициализации в длл, т.к. неясно откуда там берется tapplication). И после этих манипуляций на основном окне приложения можно будет создать панель (из dll, как спрашивал в начале)?
Германн (2011-08-14 00:32:00) [3]
> DiamondShark © (12.08.11 11:01) [22]
>
>
> > Германн © (12.08.11 01:12) [14]
> > А собирать-то кто будет?
>
> Можно подумать, вы ни одного инсталятора с выбором компонентов
> не видели.
> Наверное, даже МС Офис ни разу в жизни не ставили.
>
Не важно что видел я. Не обо мне речь. А о "кладовщиках". Да и о менеджерах тоже. :)
Дмитрий Белькевич (2011-08-13 19:13:00) [4]Устали от багрепортов... Но - вроде удалось комбинацию безглючную найти. Это только то, чего касаемся. К счастью, работу с вордом и эксплорером удалось выкосить из софта.
Дмитрий Белькевич (2011-08-13 19:10:00) [5]
> Расскажи это Microsoft, Oracle, Borland-CodeGear-Embarcadero,
> они будут приятно удивлены
Угу, помню - помню - эмбеддид борландовский вместо одного экзешника (или дллки) - гора дллок и манифестов, которые на разных операционках по-разному не работают.
Anatoly Podgoretsky (2011-08-12 17:00:00) [6]> Дмитрий Белькевич (12.08.2011 09:34:15) [15]
Word 2003 - 12 мегабайт, так это Ворд
DiamondShark (2011-08-12 11:01:00) [7]
> Германн © (12.08.11 01:12) [14]
> А собирать-то кто будет?
Можно подумать, вы ни одного инсталятора с выбором компонентов не видели.
Наверное, даже МС Офис ни разу в жизни не ставили.
Dennis I. Komarov (2011-08-12 10:51:00) [8]В длл надо выносить отдельные, логически завершенные, подпрограммы. Например модуль криптографии, некий GUI который можно будет юзать посторонним софтом и т.п.
ИМХО
Игорь Шевченко (2011-08-12 10:42:00) [9]
> Монолитный экзешник - минимум головной боли для техсаппорта
> и для юзеров
Расскажи это Microsoft, Oracle, Borland-CodeGear-Embarcadero, они будут приятно удивлены
han_malign (2011-08-12 10:09:00) [10]
> (пресловутый ShareMem)
- а если менеджеры памяти и одинаковые, и не позаботиться об очистке дублирующих ссылок на экземпляры перед выгрузкой DLL(и всех ссылок на "внутренние" экземпляры во "внешних" контейнерах) - то тоже будет "праздник со слезами на глазах"...
han_malign (2011-08-12 09:54:00) [11]
> только после приравнивания их локальным экземпляры все равно разные.
- экземпляры одинаковые - код дублируется, но "инлайнирование кода" вроде не считается тяжким грехом...
А вот если менеджеры памяти разные(пресловутый ShareMem) - тады может быть ой...
Ну и естественно надо помнить, что это не последние глобальные переменные в VCL...
han_malign (2011-08-12 09:41:00) [12]
> передать в эту 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;
Ega23 (2011-08-12 09:40:00) [13]
> Такой экзешник, кстати, еще нужно попробовать сделать...
Ну если обфускатор натравить, то легко.
А активное использование dll - это разве только в системе плагинов, это я понять могу.
Дмитрий Белькевич (2011-08-12 09:34:00) [14]Монолитный экзешник - минимум головной боли для техсаппорта и для юзеров. А кого сейчас удивишь 45-ю мегабайтами? Такой экзешник, кстати, еще нужно попробовать сделать...
> переходить на дотНЕТ
Ага, причем на последнюю версию. И таскать с собой 300 метров 'счастья'. Для каждого калькулятора.
Германн (2011-08-12 01:12:00) [15]
> DiamondShark © (10.08.11 16:34) [11]
>
>
> > Ega23 © (09.08.11 09:03) [4]
> > Я вот совершенно не понимал, откуда это маниакальное желание
> > запихнуть всё на свете в dll?
>
> Модульность, однако.
>
> 1. Можно собирать рабочие места без лишнего функционала.
>
А собирать-то кто будет?
А в конце-концов всё это дерьмо придётся разгребать техподдержке. :(
Прям как в анекдоте про сантехников. :)
_Юрий (2011-08-11 19:45:00) [16]
> QAZ (11.08.11 11:13) [12]
С точностью до наоборот
QAZ (2011-08-11 11:13:00) [17]
> переходить на дотНЕТ
чтобы получать
> ехешник на сорок пять мегабайт
и
> стопицотгигабайтный инсталяционный пакет
?
DiamondShark (2011-08-10 16:34:00) [18]
> Ega23 © (09.08.11 09:03) [4]
> Я вот совершенно не понимал, откуда это маниакальное желание
> запихнуть всё на свете в dll?
Модульность, однако.
1. Можно собирать рабочие места без лишнего функционала. Например, кладовщику не нужны модули аналитики, а менеджеру по продажам не нужны модули выписки заборных листов и печати транспортных этикеток.
2. Можно оперативно обновлять багофичи. Например, для исправления очепятки в форме выписки кассового ордера надо скопировать только модуль "Касса" размером триста килобайт, а не монолитный ехешник на сорок пять мегабайт.
3. Можно динамически расширять функционал, добавляя модули, которых раньше не было в системе. Опть же, не перекомпиливая весь монстроузный проект и не пересылая весь стопицотгигабайтный инсталяционный пакет.
...
N. PROFIT!!!
Хотя, таки да, пакеты для модульности удобнее.
А ещё лучше не страдать пассивной некрофилией, и переходить на дотНЕТ.
QAZ (2011-08-09 13:24:00) [19]
> Зачем dll нужно что-то знать о главной форме?
> А что, dll ща модно? Особенно те, которые должны знать о
> том, кто и загрузил?
афтар видимо изобретает щикарную систему плагинов
Andy BitOff (2011-08-09 13:19:00) [20]А что, dll ща модно? Особенно те, которые должны знать о том, кто и загрузил?