| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > создание в DLL динамических компонентов |
| Автор: mr.Koddy 27.5.2005, 20:32 | ||||||||||
| Пример. У меня есть программа. При некоторых событиях должна динамически создаваться форма и все что там на ней мне понадобиться. Если не использовать DLL, то все проходит на ура. Но мне хотелось бы создание формы и всего прочего впихнуть в DLL. DLL-ка у меня VCL-ная, без эмуляции VC.Билдер шестой. Код DLL:
При таком верианте форма создается. Но вот когда дело доходит до метки, то мне выдается исключение ну и адреса всякие. Метки ессно нету. Но прога не падает, как ни странно. Если же я напишу
то у меня форма создается, показывается и тут же пропадает. Никакх исключений не генериться. Если я пытаюсь всунуть еще и метку из RX LIB, то тут вообще фигня какая-то. Не знает что такое TRxLabel не смотря на то, что я добовляю
и
При этом компилятор ругается, что во-первых не может найти dxforumlibc6.lib и RXCtrls.hpp тоже не понятно где брать. Если в основной проге добавлю чтонить из этой библы, но ессно все работает. dxforumlibc6.lib и RXCtrls.hpp я и сам не нашел. Нашел только dxforumlibc6.bpl, но от этого мне мало проку. Ну а из основной проги это вызывается так(из кнопки):
Если в DLL написать например для простоты MessageBox, то все и коппилиться и вызывается корректно. |
| Автор: Vyacheslav 30.5.2005, 10:27 | ||
Вы создаете форму, показываете ее и тут же выгружаете dll. И что вы после этого хотите получить? Для начала подправте код следующим образом
|
| Автор: Guest 31.5.2005, 22:13 |
| Все работает.Но теперь появилась другая проблема - вместе с формой появляется лишняя кнопка на панели задач. Как ее убрать? ShowWindow(B->Handle, SW_HIDE); не помогает. |
| Автор: mr.Koddy 31.5.2005, 22:14 |
| выше я написал |
| Автор: Vyacheslav 1.6.2005, 09:06 |
| Собери оба проекта с включенной опцией Build with rutime package (Project->Options->Вкладка Package) |
| Автор: mr.Koddy 1.6.2005, 20:12 | ||
Мне это не подходит т.к. прогу я планирую запускать не тока на компе с билдером. |
| Автор: Vyacheslav 2.6.2005, 10:00 |
| А кто Вам мешает сделать как делают все люди, а именно использовать инсталятор , который будет переносить на комп не только твою программу, но и необходимые компоненты. Кроме того, елси при использовании dll, Вы не будете использовать данный совет, очень скоро при более менеее серьезной работе с dll нарветесь на ошибки. Первый признак: получение сообщений что то типа "Can' t assign TFont to TFont" |
| Автор: mr.Koddy 2.6.2005, 20:05 | ||||||||||||
Дело в том, что я не знаю как делают все люди т.к. прог сделаных на bcb не видел. Инсталятор конечно будет. Не не хотелось тащить кучу не маленьких файлов. По инету качать лишние пару метров я думаю не всякий захочет.Где-то я читал, что объем exe может привысить bcb_dll+bpl+exe+my_dll. Хотя я в этом сомневаюсь. Не уверен, что bpl можно сжать тем же ASPackом например. А исталяторы не все сжимают хорошо.
Посыпю голову пеплом, не совсем въехал, что это за ошибка. Но я уверен, что каждую ошибку можно решить. Сейчас думаю на другой проблемой. В DLL наследовал класс от TForm и пытаюсь традиционным образом создать форму. В инит dll добавил следующее:
Заголовочный файл dll:
DLL компилиться. В основное приложение засунул следующее:
Т.е. при прорисовке основной формы загружается DLL, и как я понимаю сначала должен выполняться код, который в DllEntryPoint записан. Ну вот прога на и ругается, что мол чето в DllEntryPoint не то. Аесли точнее то:
Если я правильно понимаю, в DllEntryPoint надо, что бы фигрировал свой Application. А как это сделать пока не нашел.Хотя може я и не прав. |
| Автор: Vyacheslav 3.6.2005, 10:10 | ||||||||||
Во-первых, странно, что не видели. С++Builder 6 например. Во-вторых, будьте последовательным. Вы уже собираетесь разбить свою программу на exe и dll, но почему-то против bpl, хотя эти те же dll. Самая первая ошибка начинающих( а Вы ведь начинающий, иначе не задавали подобных вопросов ) стараются сделать все в одном куске. Если, кстати для создания инсталятора будете использовать InstallShield, поставляемый с Borland, он сам подскажет какие bpl нужно будет включить в пакет
Блажен кто верует. Если хотите, я могу рассказать про эту "ошибку" подробнее и с удовольствием посмотрю как Вы это попытаетесь исправить. А сейчас лишь намекну, что она связана с тем, что для классов одновременно использующихся в exe и dll при статической прилинковке библиотек создаются две и более копии виртуальные таблиц первая в exe, остальные - в dll-ках. Надеюсь эта фраза прояснила, почему выдается такое странное сообщение.
Да вроде Вам на Borland X Portal все уже прописали. Повторить что ли? DLL
EXE
|
| Автор: Guest 3.6.2005, 20:01 | ||||
Видимо там(и тут?) меня не так поняли. Класс, описывающий форму я делаю в DLL. Т.е. unit.h(класс формы) я добовляю к проекту с DLL и в unit.cpp просто его "инклюдю". И в DLL-ке создаю форму.Нафик мне часть кода по созданию в ехе и часть в DLL пихать. |
| Автор: Vyacheslav 6.6.2005, 09:33 |
| И здесь и тут Вас правильно поняли и дали конкретный ответ. Вы просили: форма в dll, созданная с помощью дизайнера совсеми своими обработчиками должна использоваться в основном приложении exe. Вам это и дали. Вы бы для начала хотя бы попробовали выполнить то, что Вам советуют отвечая на Ваши вопросы. А затем уж можно давать свои оценки. |
| Автор: mrKoddy 6.6.2005, 19:47 | ||||||||
Да пробовал конечно. Сейчас попробую объяснить, чего бы мне хотелось. Это приведеный выше код в ЕХЕ
Я же ясно написал - в dll_h содержиться унаследованый класс от Tform, а в dll_cpp реализация его методов. При таком раскладе в ехе мне надо написать примерно следующее:
Т.е. как бы получается DLL-ка в определенной степени сама по себе. А наилучшим вариантом было бы конечно, что бы формы creatились в DllEntryPoint и тогда бы возможно пришлось бы переопределить метод TForm Create. Можно конечно так, как тут предлагают. Но тогда, в частности, придется обрабатывать OnClick от кнопки так:
А это мне кажется не очень изящно. Хотя может быть я от этого никуда и не денусь. |
| Автор: Vyacheslav 7.6.2005, 09:32 | ||||||||
Странная фраза. Какая разнмца, где вызывать Show. Или под "отображение" Вы понимаете что-то другое. Зато Вы получаете указатель на объект-форму, с которой можете обходится как хотите. Учтите, что файла *.h для TForm2 все равно не нужен в exe. Возвращаем TForm*, так что и exe и dll полностью развязаны. Ну а если все таки не хотите так, неужели трудно додумать? Вариант, когда при вызове будет создаваться новая форма каждый раз. Уничтожаться они будут, если будет уничтожен Owner или при их закрытии, если задан соответсвующим образом обработчик OnClose
Вот так если нужно каждый раз вызывать одну и туже форму
С этим надеюсь разобрались
Это я совсем не понял. Каким образом создание форм DllEntryPoint связано с TForm Create, тем более что мы работаем в С++. А здесь рекомендуется(в том числе и Borland ) использоватьтело конструктора И с кнопкой тоже не понял. Итак. Создаем проект dll. В нем форму. Назначаем ей все обработчики. Дописываем там же CreateMyForm. И все. Используем ее в exe. Что не так? Я просто не могу понять. Если хотите получить конкретный совет, напишите РАБОТАЮЩИЙ код, который Вас не устраивает. Просто еще раз прошу, не нужно приводить здесь Ваши домыслы и предположения. Иначе я просто не смогу ничем помочь. |
| Автор: mrKoddy 7.6.2005, 20:14 | ||||||
Ну как.
Нет Я не совсем понял, что передавать в качестве параметра Owner. Я пытаюсь передать Form1(главная форма приложения). Однако видимо не то передаю.
Создаем проект dll. В нем форму. Назначаем ей все обработчики. Дописываем там же CreateMyForm. И все. А что с кнопкой не понятно. Создать ее и Назначить ей обработчик(и) там же, в DLL. |
| Автор: Vyacheslav 8.6.2005, 09:38 | ||||||||||||
С какой стати.
Это все, что с формой нужно сделать. Где я тут приводил код по назначению каких либо обработчиков? Хотя доступ к указателю объекта позволяет в принципе подменить ее обрабочики на другие, если в этом есть необходимость. Еще раз: создаете форму в дизане в проекте dll, там же определяете обработчики. И пишите код ее показа где хотите : в exe или dll. Это безразлично. Я просто не могу уяснить, какие здесь проблемы. Эти два вопроса совершенно независимы
Обычно передается главная форма но можно и ничего не передавать(NULL). Это зависит от того как собираетесь уничтожать созданную форму. А что с передачей не так? Код абсолютно прозрачен. Как Вы определили, что указатель на форму не передается?
Ну и ради бога. Создавайте и назначайте. Здесь то какие проблемы? |
| Автор: mrKoddy 8.6.2005, 19:43 | ||||||||
А можно поподробнее, как это сделать? Допустим про
я имею понятие.
Я не говорил, что определил.Просто прога вываливается и все.
Смотрите самое начало моего поста. |
| Автор: Vyacheslav 9.6.2005, 09:59 | ||||||||
Извините, но я прочитав Ваше пост так и не нашел проблемы, которая возникает при создании обработчиков. Нельзя поподробнее для тупых
А кто мешает воспользоваться дебагером для выявления причин?
Ну как я понимаю на интересует вариант, когда мы не имеем хидера в exe? Ну например так. Мы знаем, что у формы из dll (formdll) есть кнопка с именем Button1. Находим эту кнопку
|
| Автор: mrKoddy 9.6.2005, 19:49 | ||||||||||
Ну вообще-то я имел ввиду сообщение от 8.6.2005, 19:43
При вызове функции CreateMyForm(NULL) появляется:
В принципе логично, т.к. объявление TForm2 (TForm2 *Form2) у меня есть только в DLL. Т.е. все сделано по аналогии как в и в ехе.
Опять 25.Ну не хочу я обработчик MyNewClick в ехе-модуле. |
| Автор: Vyacheslav 10.6.2005, 09:21 | ||||||||
Ну до чего уж Вы упрямый
Я Вам показал в качестве примера на Ваше
Да если не хотите, не делайте. Мы тут развели целую дискуссию вокруг проблемы, которой нет.
Да не логично это. Иначе у меня да и у всех ни одна программа не работала. Сама то форма в dll c помощью дизайнера создана или Вы просто ручками интерфейс набили? Я еще раз говорю - код в студию. Можете вот это в качестве примера хотя бы посмотреть. Там MDI окно главное и MDI-child окно и модальное в dll. Статья в принципе об использовании template, но пример к ней посмотреть можно http://bcdev.narod.ru/Articles/dll_template.htm |
| Автор: mrKoddy 10.6.2005, 19:42 | ||||||||||||||
Ручками.
Нет.
Ни вопрос. Код DLL (unit1.cpp)
Код DLL(unit1h)
Код в ехе (unit1.h)
Код в ехе (unit1.cpp)
Правда он не совсем рабочий. |
| Автор: Vyacheslav 14.6.2005, 10:18 | ||
То есть в dll у Вас dfm-файла для формы нет? Тогда все то же самое, только предварительно добавьте форму в dll через меню File->New->Form . Надеюсь и вопрос как обработчики в dll создавать отпадет сам собой |
| Автор: mrKoddy 14.6.2005, 19:51 | ||||||
Нет.
эээ..а зачем? Ее "просто так" так создать нельзя?
Я тоже надеюсь. |
| Автор: Любитель 14.6.2005, 20:27 | ||
Ну так dfm тебе все равно нужен, если в dll у тебя будет форма. |
| Автор: mrKoddy 15.6.2005, 19:38 | ||
Ну если я таким же образом создаю форму в ехе-шнике, то я без dfm обхожусь спокойно.К тому же сколько будет у меня форм, мне вообще-то не известно. Поэтому вариант с dfm отпадает. |
| Автор: Любитель 15.6.2005, 20:39 |
| Ну так тогда, насколько я знаю, ты не сможешь из dll экспортировать именно форму. Или я не прав? |
| Автор: Vyacheslav 16.6.2005, 10:09 | ||||||||
СЧАС ВЗОРВУСЬ. Во-первых, есть класс формы + dfm - это не есть объект(сама форма). Сколько экземляров этих форм будет - это зависит от программиста. Как количество форм(объектов) завит от dfm? Я уже давал код при котором, создастся столько форм, сколько раз будет вызвано это. И когда это давал, то предполагал, что TForm2 имеет dfm
А вот этот код будет всегда изпользовать только однажы созданную форму
Каким образом dfm здесь может регламентировать количество создаваемых форм? Во-вторых, Вы делая некоторые утверждения, упускаете совсем для Вас "малозначительные" факты, и тем самым вводите людей в заблужение Я уверен, что Вы не " таким же образом" создаете форму в ехе-шнике. Если у Вас она без dfm, то Вы скорее всего используете непосредственно класс TForm или используете конструктор типа TForm1(TComponent*, int). В dll же Вы пытаетесь использовать класс, производный от TForm. Разницу чувствуете? К тому же это Ваш код или не Ваш ?
В-третьих. Вам удалось сделать наконец такую простейшую вещь как экспорт формы из dll?Думаю, что нет. И это несмотря на вполне профессиональные советы двух форумов, которые Вам дают уже на протяжении полумесяца. Я еще раз повторюсь, что Вы для себя сложили какую-то несоответствующую реалиям картину "мира" и в этих рамках пытаетесь что то сделать. То , что не укладывается в вашу картинку, просто отбрасываете. Выглядит со стороны это так Вы: Как сделать это? Вам: Так-то и так-то Вы: Я так делать не буду, потому что ( далее следуют абсолютно бесмысленные доводы) И опять в по кругу И если мы не выйдем их этого круга, плодотворная работа у нас с Вами врядли получится. |
| Автор: mrKoddy 17.6.2005, 20:24 | ||||||||||||||
Значит я не правильно выразился вначале.
Да, извеняюсь, поторопился.
Мой.
Да.
Первым способом удалось, вторым нет. Причина - отсутствие ресурса TForm2.
Да, есть у меня такое. |