C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
DLL, BCB6, TForm, Внедрение в DLL форм и их использование
SHELLDER
Отправлено: 21.06.2004, 13:53


Не зарегистрирован







Доброго времени суток!

Обшарил весь фак, который был выложен на сайте, и еще много страниц интернета, но так и не нашел нормального описания создания DLL. Простые DLL-ки, в которых описываются мои классы и функции, создавать научился. Теперь стоит вопрос о создании DLL-ки, в которую помещается еще и визуальное оформление управления. Примером того, что хочу получить может послужить плугин к миранде, который показывает историю сообщений. Может кто сможет объяснить, как это осуществить? Я создаю DLL-Wizard'ом пустую DLL, потом создаю в этом же проекте форму с кнопкой, при нажатии на которую выводится сообщение "Hello". smile.gif Правлю немного header-файл формы и добавляю туда описание для экспорта/импорта класса THistForm (производный от TForm). Потом статически подключаю к основному проекту. Пишу код для вызова и отрисовки моей формы из DLL, но линковка не доходит до конца. Грит, что не знает и не понимает класс THistForm. sad.gif


Возможно, что я неправильно делаю DLL. Может кто расскажет или даст примеры для BCB6. А то есть пример для Delphi, но я в ним ничего не понимаю.
UA_Freeman
Отправлено: 21.06.2004, 15:06


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Как вариант можешь экспортировать функцию для создания обьекта формы:
CODE

extern"C"__declspec(dllexport)
THistForm*create_instance(TComponent*Owner)
{
return new THistForm(Owner);
}

потом загружаешь эту функию из DLL с помощью LoadLibrary и GetProcAddress. Все методы формы, которые ты будешь вызывать из главного проекта, обьявляй виртуальными. Вот и всё. Больше ничего экспортировать или подключать не надо. Очень просто

Отредактировано UA_Freeman — 22/06/2004, 09:06
SHELLDER
Отправлено: 21.06.2004, 16:23


Не зарегистрирован







Хм... тогда, в принципе, можно написать класс с конструктором и деструктором, в которых грамотно выделять память под форму, а потом высвобождать...

А можно маленький пример, как "Все методы формы, которые буду вызывать из главного проекта, обьявлять виртуальными."? Не совсем понял, где их объявлять виртуальными. (если мне не изменяет память, это делается через virtual?)
UA_Freeman
Отправлено: 21.06.2004, 18:07


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Для удаления обьекта формы вызываешь простой delete ptr
А виртуальными методы формы описываются путём написания слова virtual перед обьявлением метода. Это заставляет компилятор сохранять адреса методов вместе с указателем на обьект. Благодаря этому имея указатель на обьект ты можешь вызывать любой из его виртуальных методов не имея их реальной реализации в главном проекте

Например:
CODE

class TBasicView:public TForm
{
protected:
   bool closing;
public:
   dstring id;

   dstring module_name,
           menu_item_caption;
   __fastcall TBasicView(TComponent*Owner);
   virtual bool __fastcall CloseQuery();

   virtual void init_instance(dstring id,c_ini*inifile);
   virtual void show_view()=0;

   virtual void update_terminal_state(class c_terminal*modified);
   virtual bool create_settings();
   virtual void save_settings(c_ini*inifile);
   virtual bool load_settings(c_ini*inifile);
   virtual void remove_settings(c_ini*inifile);

   virtual void __fastcall show_form(TObject*Sender);

   void __fastcall WndProc(Messages::TMessage&msg);
   virtual void process_data(c_buffer &buf);
};

© PEHOME, all rights reserved smile.gif
SHELLDER
Отправлено: 22.06.2004, 05:59


Не зарегистрирован







2 UA_Freeman:
Большое спасибо за помощь. Все получилось.

Вернуться в Вопросы программирования в C++Builder