Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Dll с формой  (Прочитано 9034 раз)
0 Пользователей и 1 Гость смотрят эту тему.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« : 08-05-2008 04:11 » 

всем привет. такая проблема: необходимо создать dll с формой. экспортировать функцию, активирующую форму (создающую объект класса формы, инициализирующую и тд).
и подключить эту штуку к готовому проекту. подключение динамическое, никаких хедеров и либ-файлов. аналог плагина.
при линковке длл билдер ругается:
[Linker Error] Unresolved external '_BeforeDestruction' referenced from D:\...\DLL\UNIT2.OBJ
[Linker Error] Unresolved external '_ClassDestroy' referenced from D:\...\DLL\UNIT2.OBJ
[Linker Error] Unresolved external '_ClassCreate' referenced from D:\...\DLL\UNIT2.OBJ
[Linker Error] Unresolved external '_AfterConstruction' referenced from D:\...\DLL\UNIT2.OBJ

при строчке T[...]Form* form = new T[...]Form ();
при отсутствии линкуется, но, естественно, не работает.

может кто сталкивался, как это исправить?

p.s.
что такое длл и как с ними работать, я знаю.
поиск и гугл смотрел, книги читал, всё равно такая ошибка вылетает. такое ощущение, что галочку где-то не поставил...
« Последнее редактирование: 08-05-2008 04:14 от marat_ » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 08-05-2008 06:24 » 

Логично, что
T[...]Form* form = new T[...]Form ();
не прокатит.
Все, что касается VCL и классов делай в dll-ке, а интерфейс сделай сишный - тогда просто подгружаешь dll и руками импортируешь указатели на ф-ии. Честно говоря, не знаю, что в этом случае будет с run-time библиотеками - будет ли автоматическое связывание для dll.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 08-05-2008 07:40 » 

Проблема может быть на уровне WinAPI. С каким hInstance будет регистроваться класс в системе. Если с ׁDll, то при создании формы в основном модуле, не произойдет создание компоненты.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #3 : 08-05-2008 09:21 » 

RXL, интересно, а почему же именно этот способ описан в книгах и руководствах по билдеру?

Finch, а вот этого я не знаю... так глубоко ещё не копал
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 08-05-2008 09:26 » 

С MFC классами такое прокатывает. Так что API здесь не при чём.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #5 : 08-05-2008 09:28 » 

Джон, надо полностью класс экспортировать?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 08-05-2008 10:02 » 

Нет, классы ты можешь экспортировать в библиотеках расширения MFC и тогда они будут загружаться статически на этапе компиляции. Я делал ф-ю типа Create, которая получала родителя и возвращала указатель на созданное окно. Потом делался хитрый кастинг. Но насколько я знаю у борланда нет MFC.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 08-05-2008 10:51 » 

marat_, ты написал, что тебе нужен плагин. Вынести класс формы в dll-модуль - это одно, а сделать плагин - совсем другое.
Плагины отличает то, что они работают с единым интерфейсом (заранее известным) и ничего не экпортируют автоматом из себя в основной модуль - получение адресов ф-ий производится "руками". Соотв., ни о каком импорте классов (в смысле C++) речи быть не может.
Хотелось бы знать, какие требования к плагину у тебя и какой интерфейс ты придумал.

Таки что ты хочешь сделать? Может мы тебя плохо понимаем?...
« Последнее редактирование: 08-05-2008 10:53 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #8 : 08-05-2008 11:02 » 

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

мне задача: разработать примеры таких длл. вот с билдером проблема обнаружилась...
причём в примерах всё работатет (на бумаге)
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 08-05-2008 11:12 » 

А если так?
1. В dll определяешь класс формы.
2. Там же создаешь сишный интерфейс плагина. Например - одна ф-ия showForm.
3. Внутри showForm делаешь new T...Form и т.п., до delete.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #10 : 08-05-2008 11:14 » 

Улыбаюсь так именно так и делал Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 08-05-2008 11:19 » 

Какая у тебя версия BC++?
Можешь этот примерчик выложить тут? (в понедельник потестим Ага
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #12 : 08-05-2008 11:23 » 

шестая. пример... ну что-то вроде этого:
создаём визардом длл, кидаем форму, пишем в модуле длл

extern "C"__declspec(dllexport)void createform(HWND...)
{
    TForm1* form = new TForm1( 0 ); или  HWND
    form->ShowModal();
    delete form;
}

упрощённо, но даже это не линкуется.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 08-05-2008 11:39 » 

В понедельник проверим...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #14 : 10-05-2008 13:06 » 

всё получилось. но в причинах ошибки не разобрался
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 20-05-2008 17:15 » 

marat_, а ты не сохранил копию варианта, где не получилось?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #16 : 20-05-2008 21:33 » 

Ром, там никаких особых различий не было. мне надо было от билдовской чёрточки избавиться, поменял fatcall на stdcall и что-то там в настройках проекта соответствующее. всё заработало.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines