Вставка своего компонента в "чужую" форму
От: Demon_TM  
Дата: 18.01.05 09:03
Оценка:
Ситуация:
Есть приложение (предположим, что это пустая форма)
Приложение подгружает мою dll.
В dll передается Application от основого приложения.
Необходимо из dll создать компонент (например Panel)
на основной форме.
Второй день бьюсь — одни AV вылетают....
Re: Вставка своего компонента в "чужую" форму
От: Softwarer http://softwarer.ru
Дата: 18.01.05 09:15
Оценка:
Здравствуйте, Demon_TM, Вы писали:

D_T>Второй день бьюсь — одни AV вылетают....


Неудивительно
Re[2]: Вставка своего компонента в "чужую" форму
От: Shtirliz Россия  
Дата: 18.01.05 09:36
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, Demon_TM, Вы писали:


D_T>>Второй день бьюсь — одни AV вылетают....


S>Неудивительно


Согласен с Softwarer

Но можно и без пакаджей.
Главное чтобы менеджер памяти для приложения и для DLL был один (в файлах проектов (exe и dll) ShareMem должен быть первым из подключенных модулей).
Я так делал и не раз уже.
ТОлько одно НО, в данном случае нужно быть очень внимательным при работе.
Иначе AV как сыпались так и будут сыпаться.
... -= RSDN@Home 1.1.4 beta 3 rev 279 =- А в Winamp'e — Весь в работе
Дункан Маклауд любил ходить в лес и издеваться над кукушками.
138385660
Re[3]: Вставка своего компонента в "чужую" форму
От: Softwarer http://softwarer.ru
Дата: 18.01.05 09:46
Оценка:
Здравствуйте, Shtirliz, Вы писали:

S>Но можно и без пакаджей.

S>Главное чтобы менеджер памяти для приложения и для DLL был один (в файлах проектов (exe и dll) ShareMem должен

На этом пути таки ждет немало неприятных сюрпризов — см., например, пример с RTTI.

Работа "без пакеджей" лично мне напоминает фильм "Волга-Волга". Конкретно, эпизод:

— Это — первая мель.
КРАМС! БУХ! БРАМС!
— А это — вторая ((
Re[4]: Вставка своего компонента в "чужую" форму
От: Shtirliz Россия  
Дата: 18.01.05 11:16
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, Shtirliz, Вы писали:


S>>Но можно и без пакаджей.

S>>Главное чтобы менеджер памяти для приложения и для DLL был один (в файлах проектов (exe и dll) ShareMem должен

S>На этом пути таки ждет немало неприятных сюрпризов — см., например, пример с RTTI.


В этом согласен , потому и написал, что нада быть очень осторожным, чтобы не напороться на "вторую мель".
... -= RSDN@Home 1.1.4 beta 3 rev 279 =- А в Winamp'e — Весь в работе
Дункан Маклауд любил ходить в лес и издеваться над кукушками.
138385660
Re: Вставка своего компонента в "чужую" форму
От: DJ KARIES Россия  
Дата: 18.01.05 21:15
Оценка: +1
Здравствуйте, Demon_TM, Вы писали:

D_T>Ситуация:

D_T>Есть приложение (предположим, что это пустая форма)
D_T>Приложение подгружает мою dll.
D_T>В dll передается Application от основого приложения.
D_T>Необходимо из dll создать компонент (например Panel)
D_T>на основной форме.
D_T>Второй день бьюсь — одни AV вылетают....

Передавать классы, строки и т.д. через границы dll — НЕПРАВИЛЬНО!
Ибо любое отлтчие версии компилера, выравнивания и тому подобного несёт глюки.

Интерфейсы, числа, пакованные записи — самое то для передачи.
При этом нет зависимости от компилятора, хоть на асме пиши.

По ситуации: я использовал интерфейсы в своём случае.
... << http://dkdens.narod.ru :: http://retroforth.org >>
Re[2]: Вставка своего компонента в "чужую" форму
От: Softwarer http://softwarer.ru
Дата: 20.01.05 08:12
Оценка:
Здравствуйте, DJ KARIES, Вы писали:

DK>Передавать классы, строки и т.д. через границы dll — НЕПРАВИЛЬНО!


Безусловно. Если есть возможность для извращений — надо извращаться.

DK>Ибо любое отлтчие версии компилера, выравнивания и тому подобного несёт глюки.


А зачем Вы компилируете части одной и той же программы разными версиями компилятора?
Re[2]: Вставка своего компонента в "чужую" форму
От: Softwarer http://softwarer.ru
Дата: 20.01.05 08:21
Оценка:
Здравствуйте, DJ KARIES, Вы писали:

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


Нет. И до тех пор, пока нет необходимости писать на асме — нафига?

DK>По ситуации: я использовал интерфейсы в своём случае.


Хм. Интерфейсы-то интерфейсами, но работать все равно не будет. Тем более, если закладываться на разные версии компилятора.
Re[3]: Вставка своего компонента в "чужую" форму
От: DJ KARIES Россия  
Дата: 20.01.05 22:29
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, DJ KARIES, Вы писали:


DK>>Передавать классы, строки и т.д. через границы dll — НЕПРАВИЛЬНО!


S>Безусловно. Если есть возможность для извращений — надо извращаться.

Надо стремиться обходиться без извращений.

DK>>Ибо любое отлтчие версии компилера, выравнивания и тому подобного несёт глюки.


S>А зачем Вы компилируете части одной и той же программы разными версиями компилятора?

Отвечу вопросом на вопрос.
А зачем Вы разбиваете одну свою программу на кучу глючных dll?
... << http://dkdens.narod.ru :: http://retroforth.org >>
Re[3]: Вставка своего компонента в "чужую" форму
От: DJ KARIES Россия  
Дата: 20.01.05 22:29
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, DJ KARIES, Вы писали:


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


S>Нет. И до тех пор, пока нет необходимости писать на асме — нафига?


DK>>По ситуации: я использовал интерфейсы в своём случае.


S>Хм. Интерфейсы-то интерфейсами, но работать все равно не будет. Тем более, если закладываться на разные версии компилятора.

Интерфейсы независимы от компилятора, по сути это пакованные записи, т.е. таблицы виртуальных методов с выравниванием по границе в 1 байт.
Потому и работает COM независимо от компиляторов, т.к. есть двоичная совместимость.
А строки в Delphi, классы и непакованные записи/массивы могут быть двоично несовместимыми.

Если хочется обойтись малой кровью, и завязать всё на конкретной версии Delphi, используйте bpl.
... << http://dkdens.narod.ru :: http://retroforth.org >>
Re[4]: Вставка своего компонента в "чужую" форму
От: Softwarer http://softwarer.ru
Дата: 21.01.05 07:56
Оценка:
Здравствуйте, DJ KARIES, Вы писали:

DK>Интерфейсы независимы от компилятора, по сути это пакованные записи, т.е. таблицы виртуальных методов с выравниванием по границе в 1 байт.

DK>Потому и работает COM независимо от компиляторов, т.к. есть двоичная совместимость.

Осталось выяснить:

а) как часто нужна двоичная совместимость для произвольного приложения

б) зачем нужна двоичная совместимость, если передаваться через нее будут двоично несовместимые данные (или ты считаешь TWinControl двоично совместимым?)

DK>Если хочется обойтись малой кровью, и завязать всё на конкретной версии Delphi, используйте bpl.


Нахрена стрелять из пушки по воробьям? Разумнее обойтись малой кровью, используя dll.
Re[4]: Вставка своего компонента в "чужую" форму
От: Softwarer http://softwarer.ru
Дата: 21.01.05 08:06
Оценка:
Здравствуйте, DJ KARIES, Вы писали:

DK>>>Передавать классы, строки и т.д. через границы dll — НЕПРАВИЛЬНО!

S>>Безусловно. Если есть возможность для извращений — надо извращаться.
DK>Надо стремиться обходиться без извращений.

Хм. Давайте я теперь попрошу Вас согласовать два Ваших утверждения из квоты выше Неудобно понимать человека, который противоречит сам себе.

DK>>>Ибо любое отлтчие версии компилера, выравнивания и тому подобного несёт глюки.

S>>А зачем Вы компилируете части одной и той же программы разными версиями компилятора?
DK>Отвечу вопросом на вопрос.
DK>А зачем Вы разбиваете одну свою программу на кучу глючных dll?

Карел Чапек, шестой из двенадцати принципов литературной полемики.
Re[5]: Вставка своего компонента в "чужую" форму
От: DJ KARIES Россия  
Дата: 21.01.05 21:30
Оценка:
Здравствуйте, Softwarer, Вы писали:

DK>>Если хочется обойтись малой кровью, и завязать всё на конкретной версии Delphi, используйте bpl.


S>Нахрена стрелять из пушки по воробьям? Разумнее обойтись малой кровью, используя dll.

Если вы передаёте в dll объекты VCL, то у вас по-любому отпадает возможность использовать с этой откомпилированной dll исполняемые модули, откомпилированные компиляторыми, отличными от того, которым эту dll откомпилили
В этом случае БЕЗОПАСНЕЕ и ВЫГОДНЕЕ использовать bpl.
bpl — это dll, но использующая специальные борландовские соглашения для того, чтобы работать с дельфийскими классами, строками, и т.д. через барьер в виде динамических библиотек.
... << http://dkdens.narod.ru :: http://retroforth.org >>
Re[6]: Вставка своего компонента в "чужую" форму
От: Softwarer http://softwarer.ru
Дата: 24.01.05 09:07
Оценка:
Здравствуйте, DJ KARIES, Вы писали:

DK>>>Если хочется обойтись малой кровью, и завязать всё на конкретной версии Delphi, используйте bpl.

S>>Нахрена стрелять из пушки по воробьям? Разумнее обойтись малой кровью, используя dll.
DK>Если вы передаёте в dll объекты VCL, то у вас по-любому отпадает возможность использовать с этой откомпилированной dll исполняемые модули, откомпилированные компиляторыми, отличными от того, которым эту dll откомпилили

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

DK>В этом случае БЕЗОПАСНЕЕ и ВЫГОДНЕЕ использовать bpl.


Не так. Использовать bpl в этом случае не безопаснее и не выгоднее. Основной минус bpl — они экспортируют очень много лишнего. Нормально написанные dll обладают хорошей совместимостью по версиям (в плане написанных в разное время, откомпилированных разными группами разработчиков итп). BPL очень часто требуют перекомпиляции из-за мелких, технических изменений в связанных модулях.

DK>bpl — это dll, но использующая специальные борландовские соглашения для того, чтобы работать с дельфийскими классами, строками, и т.д. через барьер в виде динамических библиотек.


bpl — это dll, использующая несколько дополнительных соглашений для согласования содержащихся модулей итп. С классами, строками итд она работает абсолютно так же, как нормально сделанная dll. Единственно, в отличие от dll, ее нельзя заставить работать с ними ненормально.
Re: Вставка своего компонента в "чужую" форму
От: Андрей Третьяков Узбекистан http://tranvi.info
Дата: 25.01.05 05:31
Оценка:
Здравствуйте, Demon_TM, Вы писали:

D_T>Ситуация:

D_T>Есть приложение (предположим, что это пустая форма)
D_T>Приложение подгружает мою dll.
D_T>В dll передается Application от основого приложения.
D_T>Необходимо из dll создать компонент (например Panel)
D_T>на основной форме.
D_T>Второй день бьюсь — одни AV вылетают....
Покажи код создания
Re[7]: Вставка своего компонента в "чужую" форму
От: DJ KARIES Россия  
Дата: 25.01.05 21:35
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, DJ KARIES, Вы писали:


DK>>>>Если хочется обойтись малой кровью, и завязать всё на конкретной версии Delphi, используйте bpl.

S>>>Нахрена стрелять из пушки по воробьям? Разумнее обойтись малой кровью, используя dll.
DK>>Если вы передаёте в dll объекты VCL, то у вас по-любому отпадает возможность использовать с этой откомпилированной dll исполняемые модули, откомпилированные компиляторыми, отличными от того, которым эту dll откомпилили

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

Правильное решение — юзать интерфейсы, WideString'и, Packed Record'ы и т.д.
Не желательно привязываться к Delphi, к тому же определённой версии.

DK>>В этом случае БЕЗОПАСНЕЕ и ВЫГОДНЕЕ использовать bpl.


S>Не так. Использовать bpl в этом случае не безопаснее и не выгоднее. Основной минус bpl — они экспортируют очень много лишнего. Нормально написанные dll обладают хорошей совместимостью по версиям (в плане написанных в разное время, откомпилированных разными группами разработчиков итп). BPL очень часто требуют перекомпиляции из-за мелких, технических изменений в связанных модулях.

BPL уменьшают число проблем, возникающих при работе c VCL через межмодульный (exe-dll-dll) барьер.

DK>>bpl — это dll, но использующая специальные борландовские соглашения для того, чтобы работать с дельфийскими классами, строками, и т.д. через барьер в виде динамических библиотек.


S>bpl — это dll, использующая несколько дополнительных соглашений для согласования содержащихся модулей итп. С классами, строками итд она работает абсолютно так же, как нормально сделанная dll. Единственно, в отличие от dll, ее нельзя заставить работать с ними ненормально.

И я о том же.

Если вы пишете СЕРЬЁЗНУЮ систему, то вы не завязываете бинарную совместимость на особенностях Delphi выбранной на данный момент версии.
Разве НОРМАЛЬНЫЙ программист станет передавать в dll какой-нибудь TWinControl или TObject?
НЕТ!
Передавать объекты/строки/непакованные записи Delphi передавать можно только в случае, когда вы уверены, что два обменивающихся модуля откомпилированы одним и тем же компилятором с одними и теми же настройками выравнивания и теми же версиями всех библиотек.
... << http://dkdens.narod.ru :: http://retroforth.org >>
Re[8]: Вставка своего компонента в "чужую" форму
От: Softwarer http://softwarer.ru
Дата: 26.01.05 07:45
Оценка:
Здравствуйте, DJ KARIES, Вы писали:

DK>Правильное решение — юзать интерфейсы, WideString'и, Packed Record'ы и т.д.

DK>Не желательно привязываться к Delphi, к тому же определённой версии.

Неаргументированное утверждение, громко повторенное три раза, становится верным

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

DK>Если вы пишете СЕРЬЁЗНУЮ систему, то вы не завязываете бинарную совместимость на особенностях Delphi выбранной на данный момент версии.


Если я пишу серьезную систему, мне совершенно незачем постоянно думать о бинарной совместимости. Она отлично поддерживается без малейших усилий с моей стороны.

DK>Разве НОРМАЛЬНЫЙ программист станет передавать в dll какой-нибудь TWinControl или TObject?

DK>НЕТ!

Если считать нормальным программиста ОРУЩЕГО, БЕЗАРГУМЕНТАРНОГО и ДЕМАГОГИЧЕСКОГО — ничего не могу сказать по поводу того, как он станет действовать.

DK>Передавать объекты/строки/непакованные записи Delphi передавать можно только в случае, когда вы уверены, что два обменивающихся модуля откомпилированы одним и тем же компилятором с одними и теми же настройками выравнивания и теми же версиями всех библиотек.


То есть примерно в 98% случаев разработки серьезных приложений.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.