![]() |
|
|
![]()
|
|
| mr.Koddy |
|
||||||||||
|
Unregistered |
Пример. У меня есть программа. При некоторых событиях должна динамически создаваться форма и все что там на ней мне понадобиться. Если не использовать DLL, то все проходит на ура. Но мне хотелось бы создание формы и всего прочего впихнуть в DLL. DLL-ка у меня VCL-ная, без эмуляции VC.Билдер шестой.
Код DLL:
При таком верианте форма создается. Но вот когда дело доходит до метки, то мне выдается исключение ну и адреса всякие. Метки ессно нету. Но прога не падает, как ни странно. Если же я напишу
то у меня форма создается, показывается и тут же пропадает. Никакх исключений не генериться. Если я пытаюсь всунуть еще и метку из RX LIB, то тут вообще фигня какая-то. Не знает что такое TRxLabel не смотря на то, что я добовляю
и
При этом компилятор ругается, что во-первых не может найти dxforumlibc6.lib и RXCtrls.hpp тоже не понятно где брать. Если в основной проге добавлю чтонить из этой библы, но ессно все работает. dxforumlibc6.lib и RXCtrls.hpp я и сам не нашел. Нашел только dxforumlibc6.bpl, но от этого мне мало проку. Ну а из основной проги это вызывается так(из кнопки):
Если в DLL написать например для простоты MessageBox, то все и коппилиться и вызывается корректно. |
||||||||||
|
|||||||||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Вы создаете форму, показываете ее и тут же выгружаете dll. И что вы после этого хотите получить? Для начала подправте код следующим образом
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Все работает.Но теперь появилась другая проблема - вместе с формой появляется лишняя кнопка на панели задач. Как ее убрать?
ShowWindow(B->Handle, SW_HIDE); не помогает. |
|||
|
||||
| mr.Koddy |
|
|||
|
Unregistered |
выше я написал
|
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Собери оба проекта с включенной опцией Build with rutime package (Project->Options->Вкладка Package)
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| mr.Koddy |
|
|||
|
Unregistered |
Мне это не подходит т.к. прогу я планирую запускать не тока на компе с билдером. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
А кто Вам мешает сделать как делают все люди, а именно использовать инсталятор , который будет переносить на комп не только твою программу, но и необходимые компоненты. Кроме того, елси при использовании dll, Вы не будете использовать данный совет, очень скоро при более менеее серьезной работе с dll нарветесь на ошибки. Первый признак: получение сообщений что то типа "Can' t assign TFont to TFont"
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| mr.Koddy |
|
||||||||||||
|
Unregistered |
Дело в том, что я не знаю как делают все люди т.к. прог сделаных на bcb не видел. Инсталятор конечно будет. Не не хотелось тащить кучу не маленьких файлов. По инету качать лишние пару метров я думаю не всякий захочет.Где-то я читал, что объем exe может привысить bcb_dll+bpl+exe+my_dll. Хотя я в этом сомневаюсь. Не уверен, что bpl можно сжать тем же ASPackом например. А исталяторы не все сжимают хорошо.
Посыпю голову пеплом, не совсем въехал, что это за ошибка. Но я уверен, что каждую ошибку можно решить. Сейчас думаю на другой проблемой. В DLL наследовал класс от TForm и пытаюсь традиционным образом создать форму. В инит dll добавил следующее:
Заголовочный файл dll:
DLL компилиться. В основное приложение засунул следующее:
Т.е. при прорисовке основной формы загружается DLL, и как я понимаю сначала должен выполняться код, который в DllEntryPoint записан. Ну вот прога на и ругается, что мол чето в DllEntryPoint не то. Аесли точнее то:
Если я правильно понимаю, в DllEntryPoint надо, что бы фигрировал свой Application. А как это сделать пока не нашел.Хотя може я и не прав. |
||||||||||||
|
|||||||||||||
| Vyacheslav |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Во-первых, странно, что не видели. С++Builder 6 например. Во-вторых, будьте последовательным. Вы уже собираетесь разбить свою программу на exe и dll, но почему-то против bpl, хотя эти те же dll. Самая первая ошибка начинающих( а Вы ведь начинающий, иначе не задавали подобных вопросов ) стараются сделать все в одном куске. Если, кстати для создания инсталятора будете использовать InstallShield, поставляемый с Borland, он сам подскажет какие bpl нужно будет включить в пакет
Блажен кто верует. Если хотите, я могу рассказать про эту "ошибку" подробнее и с удовольствием посмотрю как Вы это попытаетесь исправить. А сейчас лишь намекну, что она связана с тем, что для классов одновременно использующихся в exe и dll при статической прилинковке библиотек создаются две и более копии виртуальные таблиц первая в exe, остальные - в dll-ках. Надеюсь эта фраза прояснила, почему выдается такое странное сообщение.
Да вроде Вам на Borland X Portal все уже прописали. Повторить что ли? DLL
EXE
-------------------- С уважением, Вячеслав Ермолаев |
||||||||||
|
|||||||||||
| Guest |
|
||||
|
Unregistered |
Видимо там(и тут?) меня не так поняли. Класс, описывающий форму я делаю в DLL. Т.е. unit.h(класс формы) я добовляю к проекту с DLL и в unit.cpp просто его "инклюдю". И в DLL-ке создаю форму.Нафик мне часть кода по созданию в ехе и часть в DLL пихать. |
||||
|
|||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
И здесь и тут Вас правильно поняли и дали конкретный ответ. Вы просили: форма в dll, созданная с помощью дизайнера совсеми своими обработчиками должна использоваться в основном приложении exe. Вам это и дали. Вы бы для начала хотя бы попробовали выполнить то, что Вам советуют отвечая на Ваши вопросы. А затем уж можно давать свои оценки.
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| mrKoddy |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 3.6.2005 Репутация: нет Всего: нет |
Да пробовал конечно. Сейчас попробую объяснить, чего бы мне хотелось. Это приведеный выше код в ЕХЕ
Я же ясно написал - в dll_h содержиться унаследованый класс от Tform, а в dll_cpp реализация его методов. При таком раскладе в ехе мне надо написать примерно следующее:
Т.е. как бы получается DLL-ка в определенной степени сама по себе. А наилучшим вариантом было бы конечно, что бы формы creatились в DllEntryPoint и тогда бы возможно пришлось бы переопределить метод TForm Create. Можно конечно так, как тут предлагают. Но тогда, в частности, придется обрабатывать OnClick от кнопки так:
А это мне кажется не очень изящно. Хотя может быть я от этого никуда и не денусь. |
||||||||
|
|||||||||
| Vyacheslav |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Странная фраза. Какая разнмца, где вызывать Show. Или под "отображение" Вы понимаете что-то другое. Зато Вы получаете указатель на объект-форму, с которой можете обходится как хотите. Учтите, что файла *.h для TForm2 все равно не нужен в exe. Возвращаем TForm*, так что и exe и dll полностью развязаны. Ну а если все таки не хотите так, неужели трудно додумать? Вариант, когда при вызове будет создаваться новая форма каждый раз. Уничтожаться они будут, если будет уничтожен Owner или при их закрытии, если задан соответсвующим образом обработчик OnClose
Вот так если нужно каждый раз вызывать одну и туже форму
С этим надеюсь разобрались
Это я совсем не понял. Каким образом создание форм DllEntryPoint связано с TForm Create, тем более что мы работаем в С++. А здесь рекомендуется(в том числе и Borland ) использоватьтело конструктора И с кнопкой тоже не понял. Итак. Создаем проект dll. В нем форму. Назначаем ей все обработчики. Дописываем там же CreateMyForm. И все. Используем ее в exe. Что не так? Я просто не могу понять. Если хотите получить конкретный совет, напишите РАБОТАЮЩИЙ код, который Вас не устраивает. Просто еще раз прошу, не нужно приводить здесь Ваши домыслы и предположения. Иначе я просто не смогу ничем помочь. -------------------- С уважением, Вячеслав Ермолаев |
||||||||
|
|||||||||
| mrKoddy |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 3.6.2005 Репутация: нет Всего: нет |
Ну как.
Нет Я не совсем понял, что передавать в качестве параметра Owner. Я пытаюсь передать Form1(главная форма приложения). Однако видимо не то передаю.
Создаем проект dll. В нем форму. Назначаем ей все обработчики. Дописываем там же CreateMyForm. И все. А что с кнопкой не понятно. Создать ее и Назначить ей обработчик(и) там же, в DLL. |
||||||
|
|||||||
| Vyacheslav |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
С какой стати.
Это все, что с формой нужно сделать. Где я тут приводил код по назначению каких либо обработчиков? Хотя доступ к указателю объекта позволяет в принципе подменить ее обрабочики на другие, если в этом есть необходимость. Еще раз: создаете форму в дизане в проекте dll, там же определяете обработчики. И пишите код ее показа где хотите : в exe или dll. Это безразлично. Я просто не могу уяснить, какие здесь проблемы. Эти два вопроса совершенно независимы
Обычно передается главная форма но можно и ничего не передавать(NULL). Это зависит от того как собираетесь уничтожать созданную форму. А что с передачей не так? Код абсолютно прозрачен. Как Вы определили, что указатель на форму не передается?
Ну и ради бога. Создавайте и назначайте. Здесь то какие проблемы? -------------------- С уважением, Вячеслав Ермолаев |
||||||||||||
|
|||||||||||||
| mrKoddy |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 3.6.2005 Репутация: нет Всего: нет |
А можно поподробнее, как это сделать? Допустим про
я имею понятие.
Я не говорил, что определил.Просто прога вываливается и все.
Смотрите самое начало моего поста. Это сообщение отредактировал(а) mrKoddy - 8.6.2005, 19:52 |
||||||||
|
|||||||||
| Vyacheslav |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Извините, но я прочитав Ваше пост так и не нашел проблемы, которая возникает при создании обработчиков. Нельзя поподробнее для тупых
А кто мешает воспользоваться дебагером для выявления причин?
Ну как я понимаю на интересует вариант, когда мы не имеем хидера в exe? Ну например так. Мы знаем, что у формы из dll (formdll) есть кнопка с именем Button1. Находим эту кнопку
-------------------- С уважением, Вячеслав Ермолаев |
||||||||
|
|||||||||
| mrKoddy |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 3.6.2005 Репутация: нет Всего: нет |
Ну вообще-то я имел ввиду сообщение от 8.6.2005, 19:43
При вызове функции CreateMyForm(NULL) появляется:
В принципе логично, т.к. объявление TForm2 (TForm2 *Form2) у меня есть только в DLL. Т.е. все сделано по аналогии как в и в ехе.
Опять 25.Ну не хочу я обработчик MyNewClick в ехе-модуле. |
||||||||||
|
|||||||||||
| Vyacheslav |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Ну до чего уж Вы упрямый
Я Вам показал в качестве примера на Ваше
Да если не хотите, не делайте. Мы тут развели целую дискуссию вокруг проблемы, которой нет.
Да не логично это. Иначе у меня да и у всех ни одна программа не работала. Сама то форма в dll c помощью дизайнера создана или Вы просто ручками интерфейс набили? Я еще раз говорю - код в студию. Можете вот это в качестве примера хотя бы посмотреть. Там MDI окно главное и MDI-child окно и модальное в dll. Статья в принципе об использовании template, но пример к ней посмотреть можно http://bcdev.narod.ru/Articles/dll_template.htm -------------------- С уважением, Вячеслав Ермолаев |
||||||||
|
|||||||||
| mrKoddy |
|
||||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 3.6.2005 Репутация: нет Всего: нет |
Ручками.
Нет.
Ни вопрос. Код DLL (unit1.cpp)
Код DLL(unit1h)
Код в ехе (unit1.h)
Код в ехе (unit1.cpp)
Правда он не совсем рабочий. |
||||||||||||||
|
|||||||||||||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
То есть в dll у Вас dfm-файла для формы нет? Тогда все то же самое, только предварительно добавьте форму в dll через меню File->New->Form . Надеюсь и вопрос как обработчики в dll создавать отпадет сам собой -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| mrKoddy |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 3.6.2005 Репутация: нет Всего: нет |
Нет.
эээ..а зачем? Ее "просто так" так создать нельзя?
Я тоже надеюсь. |
||||||
|
|||||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: нет Всего: 92 |
Ну так dfm тебе все равно нужен, если в dll у тебя будет форма. |
|||
|
||||
| mrKoddy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 3.6.2005 Репутация: нет Всего: нет |
Ну если я таким же образом создаю форму в ехе-шнике, то я без dfm обхожусь спокойно.К тому же сколько будет у меня форм, мне вообще-то не известно. Поэтому вариант с dfm отпадает. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: нет Всего: 92 |
Ну так тогда, насколько я знаю, ты не сможешь из dll экспортировать именно форму. Или я не прав?
|
|||
|
||||
| Vyacheslav |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
СЧАС ВЗОРВУСЬ. Во-первых, есть класс формы + dfm - это не есть объект(сама форма). Сколько экземляров этих форм будет - это зависит от программиста. Как количество форм(объектов) завит от dfm? Я уже давал код при котором, создастся столько форм, сколько раз будет вызвано это. И когда это давал, то предполагал, что TForm2 имеет dfm
А вот этот код будет всегда изпользовать только однажы созданную форму
Каким образом dfm здесь может регламентировать количество создаваемых форм? Во-вторых, Вы делая некоторые утверждения, упускаете совсем для Вас "малозначительные" факты, и тем самым вводите людей в заблужение Я уверен, что Вы не " таким же образом" создаете форму в ехе-шнике. Если у Вас она без dfm, то Вы скорее всего используете непосредственно класс TForm или используете конструктор типа TForm1(TComponent*, int). В dll же Вы пытаетесь использовать класс, производный от TForm. Разницу чувствуете? К тому же это Ваш код или не Ваш ?
В-третьих. Вам удалось сделать наконец такую простейшую вещь как экспорт формы из dll?Думаю, что нет. И это несмотря на вполне профессиональные советы двух форумов, которые Вам дают уже на протяжении полумесяца. Я еще раз повторюсь, что Вы для себя сложили какую-то несоответствующую реалиям картину "мира" и в этих рамках пытаетесь что то сделать. То , что не укладывается в вашу картинку, просто отбрасываете. Выглядит со стороны это так Вы: Как сделать это? Вам: Так-то и так-то Вы: Я так делать не буду, потому что ( далее следуют абсолютно бесмысленные доводы) И опять в по кругу И если мы не выйдем их этого круга, плодотворная работа у нас с Вами врядли получится. -------------------- С уважением, Вячеслав Ермолаев |
||||||||
|
|||||||||
| mrKoddy |
|
||||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 3.6.2005 Репутация: нет Всего: нет |
Значит я не правильно выразился вначале.
Да, извеняюсь, поторопился.
Мой.
Да.
Первым способом удалось, вторым нет. Причина - отсутствие ресурса TForm2.
Да, есть у меня такое. |
||||||||||||||
|
|||||||||||||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |