![]() |
|
|
![]()
|
|
| Bima |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Добрый день.
Сразу напишу, внизу смотрел ("А здесь смотрели?"). В основном там вызов из главной программы, формы, которая спрятана в DLL. Ситуация такая: Есть код DLL на Visual C++. В него нужно вставить некоторые сетевые взаимодействия. Полностью программировать на Visual C++, не то что бы не охота, просто все упирается в отсутствие сетевых протоколов и громоздкостью программного кода, который придется писать (если найти структуру протокола). Поэтому решил сконвертировать код под ВСВ. Запустил мастер на ВСВ и сконвертировал код. Протестировал готовую DLL, все работает. Для вставки сетевых протоколов хочу использовать INDY (есть готовые примеры реализации). Что бы создать хоть один динамический компонент INDY приходится вставлять на форму такой же один компонет. Вот и хочу в проект вставить форму и пользоваться ее свойствами. Показывать я ее не буду, так что она нужна только для компонентов. Сконвертированный код DLL такой: dataserv.bpf:
dataserv.cpp:
Для вставки формы я создал чистый проект и сохранил его в папке App. Потом открыл проект с DLL и вставил туда форму (из проекта App). при сохранении проекта у меня получился файл dataserv.bpf вот таким:
пришлось его поравить на прежний и вставить новую строку:
при компиляции проекта выскакивала ошибка: [Linker Error] Unable to open file 'CONTROLS.RES' я переменовал файл *.res из проекта App в CONTROLS.RES и после этого компиляция прошла успешно. Но как бы я ни пытался использовать свойсва компонентов на форме, ничего у меня не получается. Компиляция проходит успешно, а на момент исполнения кода DLL все свойства неопределены. Догадываюсь, что форму нужно загрузить в память, но как??? Если делаешь проект с программой об этом не задумываешься, а здесь как??? P.S. DLL-ку писал не я -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||||||
|
|||||||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Вообще то для таких веще предназначен TDataModule Это называется -"высшее без среднего". Вы до сих по не знаете как создавать эксземпляры класса? 1. Создаем новый проект dll c использование VCl 2. Cоздаем TDataModule, например TMyDataModule 3. В нем реализуем весь неоюходимый нам фукционал 4. Пишем функцию
5 . При работе грузим dll. Вызываем функцию CreateModule, которая возвращает нам экземпляр TMyDataModule и работаем с ним -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Интересно выходит, а как мне отлаживать 2 Dll?
Выходит так, что программа вызывает DLL (написанную на Visual C++), та в свою очередь вызывает DLL с VCL. C TDataModule не работал, сейчас через поисковик начну собирать информацию -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Vyacheslav, есть просьба, напиши пример для реализации вот такого случая:
из Dll, нужно вызвать функцию (для примера test), которая возвращает случайное число(для примера). как ее запихнуть в TDataModule и сделать DLL. как потом ее вызвать из моей DLL-ки??? Облазил весь форум, что то ничего не нашел, в книгах Архангельского тоже что-то ничего не нашел :( -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
ээээ.... ничего не понял :(
создал DLL: код *.cpp такой:
Если честно, то я не понял зачем нужно создавать экземпляр класса, если на него ничего положить нельзя!!! Скомпилил... все нормально Что дальше делать??? второй код, я вообще его не могу никуда приладить :(. на первой строчке у меня выскакивает ошибка (у меня нет формы) и так по каждой строке :( -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Что ознаяаю точки в моем коде Вы догадываетесь?
Как добавлять TDataModule в dll Вы знаете? Как к TDataModule добавлять свои методы знаете? Я же Вам написал порядок созлания dll. Похоже Вы поняли и спросили как вызвать. Я Вам показал Вызов. А Вы в ответ в dll написали полную хрень PS. Запомните раз и навсегда: класс и экземпляр класса разные вещи.То что Вы кладете на форму (дата модуль) - это Вы формируете класс. В приложении exe все формы попадают в список автосоздаваемых: это означает, что экземпляры объектов классов форм будут созданы на автомате. см Project->Option->Forms, где показано, экземпляры для каких форм будут созданы автоматом, а какие не. (по умолчанию все создаются автоматом) . В dll экземпляры форм автоматом не создаются . Вы должны их создать с помощью new. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Bima |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
нет, я же писал выше. На форуме не нашел.
то же нет, так как с TDataModule не работал.
возможно, я не разу не делал DLL, и не использовал TDataModule, поэтому и спросил совета. Хорошо, не будем ходить вокруг да около... спрошу прямо, как переделать мою программу в DLL, в которой будет доступна всего лишь одна функция SendUdp??? код программы, *.срр
весь код программы представлен ниже. Присоединённый файл ( Кол-во скачиваний: 4 )
UDP.rar 3,72 Kb-------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||||||
|
|||||||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Извините, я не собираюсь разбираться в Вашей программе.
Вы не не нашли ?
Ну если Вы не в состоянии найти необходимые кнопки в С++ Builder и пользоваться хелпом то пошагам 1. File->New->Other-> Dll WIzard 2. File->New->Other->DataModule Переименовываем его , например, в TMyDataModule 3. На всякий случай, если Вы не умеете руками добавлять свои методы к классам, то View->Class Explorer ->клик правой кнопкой на классе TMyDataModule -> New Method Далее заполняем все что нужно. На DataModule кладем все нужные нам компоненты и пишем релизацию наших методов 4. Пишем ручками
6. В exe вставлем код по загрузке и вызову CreateModul, получаем экземпляр TMyDataModule и вызываем нужные на методы -------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Bima |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Простите за назойливый вопрос, где писать??? Пока остановился на данном шаге. сделал как сказано, получил следующее: Код DLL *.cpp
код DataModule *.срр
хейдер DataModule *.h
Догадываюсь, что нужно, что то вставить в хейдер самой DLL, то есть декларацию моих экспортируемых функций, но вот как... ума не приложу... если брать образец из книги Архангельского, то нужно написать примерно так:
но я не уверен в правильности написания да и возвращаемое значение (int) не знаю нужно ли??? -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||||||||
|
|||||||||||
| Vyacheslav |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
В любом Вам удобном месте. Ну например перед реализацией конструктора модуля. Если сделать вот так, то никакой хидер Вам в exe не понадобится Код Application c одной формой и кнопкой
DLL: хидер
cpp
-------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
| Bima |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
:(
ничего не выходит :( , хотя делал как написали. вот код DLL *.cpp
код DataModule *.cpp
код DataModule *.h
Пытался сделать программу, где подсоединяю DLL. на форме кнопка и Label. вот код: *.cpp
хейдер формы
При нажатии на кнопку ничего не происходит. Пытался смотреть со стороны DLL (пускал ее в режиме отладке, там она вообще не вызывается) :( Это сообщение отредактировал(а) Bima - 11.5.2007, 05:35 -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||||||||
|
|||||||||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Решил проблему.
Взял пример из книги, переделал его под свой и получил DLL, которую статически подключаю к форме. в примере правда используется не DataModule, а обыкновенная форма. -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Это Вы загнули. Вы сделали не так. Для начала Вам просто стоило взять все один к одному, а дальше приводить к своему варианту. Но Вы же крутой программист
Зачем было в try/cath обрамялть, если Вы выкинули генерацию исключений. А если бы Вы их оставили, то Вам было сообщено, что функция _SendUdp не найдена. А вот это вообще маразм
Извините, но у меня возникает такое ощущение, что не даже пытаетесь осмыслить, что пишут Вам и что Вы сами пишите -------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Bima |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Как раз я так и делал(все скопиовал один в один). Я конечно понимаю, что вам трудно было написать весь код, поэтому вы кусками из своей программы давали код или из памяти (тут я не телепат), но то, что я один в один сделал, как было написано - не заработало. Я сначала подумал, что хейдеров нужных нет, и начал копаться в справке, но после вставки нужных, компилятор упорно не хотел понимать catch(Exception& excp) и подобные вещи.
Это самый последний мой вариант, который я тестировал в два часа ночи. Поэтому я не стал его править, а просто выложил сюда. До этого у меня там было написано SendUdp, который кстати тоже не заработал.
Я бы может и понял, если бы коментарии были, а так половина кода, для меня была темным лесом, хоть и пытался в нем честно разобраться. для примера вот этот код:
То есть, как я понимаю, для создания TMyDataModule нужен указатель на форму, который используется в функции.... А если мне параметры нужно передать??? А если у меня несколько функций. Может для вас этот код очень легкий, но для меня он совершенно не прозрачный и взглянув на него через год, я буду думать, а что я здесь накуралесил, а какой здесь алгоритм??? В результате всего TMyDataModule для меня так и остался загадкой, с которой я бы хотел разобраться, и пришлось делать более простые алгоритмы(хоть и не такие эффективные), которые я взял из книжки. -------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
||||||||
|
|||||||||
![]()
|
| Правила форума "С++ 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. |