![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
Всем привет!
Подскажите, плиз, как разбить прогу на несколько DLL и притом чтобы это было поумнее. Вся беда в том, что или нельзя делать классы в DLL или я незнаю как это делать. Вообщем, если кто знает как это сделать, то поделитесь, плиз. Заранее благодарен. -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| Medved |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 14 Всего: 154 |
Выделяешь основные функции, и запихиваешь их в DLL.Я Вам посоветую прежде всего почитать хоть какую-нибудь литературу.
Вот могу дать код, он написан в целях обучения моего младшего брата, показывающий, как работать с DLL на самом примитивном уровне. Думаю не сложно будет разобраться. Код DLL:
Код проекта, подключающего DLL:
-------------------- |
||||
|
|||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Использование string в dll нежелательно, так как могут возникать проблемы с разделением памяти, вместо этого нужно целесообразней использовать PChar. Что и написано в тексте сгенеренного Дельфи проекта.
|
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 14 Всего: 154 |
Согласен. -------------------- |
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
Народ, может я не так высказался, но то что вы написали всё понятно, проблема в другом, возможно ли каким бы то нибыло образом вынести классы (включая их определения) в DLL.
То что можно все методы данного классы туда вынести - это понятно, но хотелось бы вынести САМ КЛАСС! Вопрос то конечно глупый, можно просто использовать activeX, но нехотелось бы... -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Можно, а в чем проблема? -------------------- Волны гасят ветер... |
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
Да проблема то в том как импортировать - экспортировать метод - понятно, а как это применить к классу???
-------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| Unregistered |
|
|||
|
Unregistered |
ты хочешь создавать наследников от этого класса?
|
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
Да нет просто использовать его, хотя наследование не исключено
-------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Самый простой пример - TForm. По аналогии для любого другого класса. И, возможно, ты путаешь класс и экземпляр класса? Есть модуль в котором описан какой-то класс. Включи его в длл и в свою прогу. Ну и юзай его.
|
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
Да ничего я не путаю. Как делается наследование - я знаю. ПРОБЛЕМА В ТОМ, ЧТОБЫ КЛАСС БЫЛ ОПИСАН В DLL!!! -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
А по аоводу включения и туда и сюда - не хотелось бы т.к. это всё делается для того, чтобы получить прогу ввиде нескольких модулей и притом маленьких. -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| Unregistered |
|
|||
|
Unregistered |
наследовать (в классическом виде) не получиться однозначно...
а чем не устраивает ActiveX? |
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
Да там как я понимаю надо описывать TLB.
А в это TLB все параметры имеют весьма экзотичный тип. Да иего надо регистрить в реестре, что тоже снижает привлекательность. -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
В качестве ДЛЛ можно использовать пакеты Дельфи (BPL), поскольку они на самом деле являются ДЛЛ, но обладают большими возможностями при использовании классов. Какими точно я не помню - все ето я мельком просматривал в книге Марко Кенту "Delphi 6 для профессионалов". Так что поищи материальчик про их юзание.
Это сообщение отредактировал(а) <Spawn> - 29.5.2003, 14:51 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Unregistered |
|
|||
|
Unregistered |
1. TLB Дельфя тебе может написать сама для любой Dll (если ты ее попросишь)
2. "Экзотические типы" придется использовать однозначно (деректива stdcall это какрас для конвертации праметров процедур из "экзотического" (нравиться мне слово) типа в паскалевский) 3. Наверное BPL для тебя и вправду лучший вариант, но хорошо ли ты себе представляешь задачу? расскажи почему возникла необходимость "делить" проект? почему нельзя пользоваться общей библиотекой классов? |
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
Короче ситуация такова:
Есто проект. Этот проект постоянно совершенствуется и обновляется. Тянуть из инета каждый раз по 3 метра не очень. Вот и разбиваю, чтобы вытягивать только новое. -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| Unregistered |
|
|||
|
Unregistered |
можно написать библиотеку классов (набор исходников) и при внесение изменений в тот или иной класс обновлять соответствующий исходник и перекомпилять проект (для меня это лучший вариант, я тоже не доверяю ole типам
|
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
Вот это-то и оно. Ради того, чтобы сам exe не перекомпиливать это всё и затеено!!! -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| Unregistered |
|
|||
|
Unregistered |
ну и ладноть...
так какие проблемы то, давай сделаем на ActiveX... расскажи что конкретно хочешь, пока время есть вместе замусолим...;) |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Если ваша программа включает VisualCLX компоненты, Вы должны использовать пакеты вместо DLL. Только пакеты могут управлять запуском и закрытием Qt -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| Unregistered |
|
|||
|
Unregistered |
Cashey Спасибо, друг...
ты ответил на мой извечный вопрос: "почему не регистрятся некоторые Dll?..." спасибо... |
|||
|
||||
| altarasjuk |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
Unregistered Я может неправильно выразился, но всё это для того, чтобы НЕ ПЕРЕКОМПИЛИВАТЬ ПРОЕКТ, А ТОЛЬКО ОДИН МОДУЛЬ! -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
||||
|
|||||
| Unregistered |
|
|||
|
Unregistered |
По мне так если прога не распределенная и средство разработки одно то кроме гемороя с этой модульностью ничего не получиться. Компоненты писать безусловно надо, но зачем их в dll прятать...?
|
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
То есть если я понял то есть только один вариант - компоненты. Но в них есть недостаток - расширение.
Не хотелось бы, чтобы народу с первого взгляда было понятно на чём писано... Да и DLL как-то попривычней для взгляда... Ну если тока так - то буду разделять на компоненты. А вот по поводу гемороя - тут никуда ни денешся. -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| Fantasist |
|
||||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Честно говоря, до сих пор не понял проблему. Что значит "экспортировать классы"? Как ты это себе предствляешь? Если ты используешь эти классы в екзешнике, то описание этих классов тебе все равно надо включить в код екзешника, а для этого вполне подойдут обыкновенные исходники. А уж указатель на экземпляр класса передать вообще нет никаких проблем. В хорошой реализации это будет выглядеть так:
mobj_ifc.pas
mobj_imp.pas
mobj_dll.dpr
main_exe.pas
-------------------- Волны гасят ветер... |
||||||||
|
|||||||||
| Unregistered |
|
|||
|
Unregistered |
а меня есть сомнения (и большие) что приведенный код заработает.
1. неплохо было бы в маинехе в интерфейсе хотябы описать интерфейс имобж 2. у длл и приложения разные адресные пространства и хз что за указатель получиться. Для идентификации интерфейсов используют гуид, а для получения экземпляра по интерфейсу - фабрику классов... хотя в дельфях все выглядит очень приметивно. |
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
Да вообщем то спасибо, народ.
Вообщем я решил остановиться на компонентах. -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| Fantasist |
|
||||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
main_exe.pas
На это вам стоило бы обратить внимание.
Ничего подобного - адресное пространство одно и то же, указатель передавать вполне можно.
GUID добавить не проблема - Shift+Сtrl+G. Фабрикой классов как раз и выступает функция CreateMObj. Делать отдельный объект+интерфейс совершенно необязательно. -------------------- Волны гасят ветер... |
||||||||
|
|||||||||
| Unregistered |
|
|||
|
Unregistered |
Прошу прощения за неточности (а точнее говоря бред) который написал выше (был пьян
однако, нельзя ли вместо uses mobj_ifc; использовать только гуид интерфейса? если длл зарегистрирована на др. машине можно ли будет пользоваться указателем на интерфейс (CreateMObj Result)? |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
продолжая тему...
вот скажем выстовил я в опциях проекта, что все надо раскидывать по пакетам (*.bpl). Как мне узнать теперь те пакеты, которые использует мое приложение. Т.е. получить название файла пакета, например vcl70.bpl для стандартных VCL компонентов или там inet70.bpl. Я вот честно говоря не очень уверен, что TBitBtn находится в vcl70.bpl... т.е. я хочу создать дистриб проги... ну не лазить же мне по её импортам что б определить какой пакет нужен И еще: только ли классы помещаются в пакеты, скажем просто функция может быть помешена в *.bpl ?Как осуществляется контроль версий пакета ? -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
Не знаю способа, лично я лажу через фар - ExeInfo по exe или dll или ещё там что...
-------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Только гуид ничего не даст - описание интерфейса все-равно нужно (как ты его иначе использовать будешь?) Другая машина - это совсем другой разговор, как и другой процесс. Здесь передавать адреса на прямую не имеет смысла, ибо адресные пространства разные, здесь необходим маршалинг, не говоря уже о службе создания удаленных объектов, но это отдельный разговор. -------------------- Волны гасят ветер... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |