| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > экспорт класса из dll |
| Автор: TaNK 22.9.2010, 13:48 | ||||
| Уважаемые, прочитал уйму статей в интернете, но все равно не пойму как реализовать сабж. main.h
main.cpp
запустил code::blocks 10.05 и получили dll не пойму как вызвать из основной проги с помощью LoadLibrary и обраться к функции класса Print(); |
| Автор: borisbn 22.9.2010, 14:14 | ||
| Раз ты экспортируешь класс, то ты должен его импортировать, а LoadLibrary здесь не нужна. Просто включаешь в основной программе твой main.h, подключаешь lib-файл, полученный при сборке dll-ки и просто используешь класс. типа того:
|
| Автор: TaNK 22.9.2010, 14:16 |
| borisbn - у меня code::blocks не создает *.lib а есть что то типа libDLL.dll.a libDLL.dll.def |
| Автор: borisbn 22.9.2010, 14:23 | ||||
А ещё лучше создать интерфейс, наследоваться от него ( реализовать имплементацию ), создать и экспортировать всего одну функцию, создающую имплементацию.
А в основной программе:
|
| Автор: TaNK 22.9.2010, 14:27 |
| virtual IFace() {} - ругается что конструктор не может быть виртуальным...убрать определение virtual? |
| Автор: borisbn 22.9.2010, 14:32 | ||||
TaNK, пардон. это должен был быть виртуальный деструктор
и то же самое с
стучи в жаббер, чтобы не захламлять форум |
| Автор: TaNK 22.9.2010, 14:57 |
| Я запутался....можно ли увидеть приведенный пример уже готовй со всеми файлами....а т я не пойму что к чему должно бытьпривязано...огромное спасибо |
| Автор: TaNK 22.9.2010, 15:15 | ||||||||
| прошу прощения все получилось....был невнимателен! Добавлено через 3 минуты и 41 секунду main.h
main1.h
main.cpp
запускаем main.cpp - получчаем dll в основной проге
borisbn + 1 |
| Автор: xvr 22.9.2010, 15:57 |
| Поздравляю. До повторного изобретения COM'а остался один шаг (GUID + QueryInterface) |
| Автор: TaNK 23.9.2010, 07:54 |
| Уважаемые, а скажите а зачем делать класс абстрактным? и еще пример class Date(){}; class subdate: public Date { // } мне нужен тип Date, но обратиться я не могу т.к. в Date объвлена чистая виртуальная функуия, как быть в этом случае, какой тип использовать в классе subdate |
| Автор: GremlinProg 23.9.2010, 09:05 | ||
|
| Автор: xvr 23.9.2010, 09:16 | ||
| Что бы наследники не забыли их определить Отдельно стоит случай абстрактного класса, состоящего ИСКЛЮЧИТЕЛЬНО из чисто виртуальных функций (пример interface'а). Такой класс можно безопасно экспортировать куда угодно, т.к. де факто в нем кроме таблицы виртуальных функций (причем оригинальная VTBL этого класса НИКОГДА не будет использоваться) вообще ничего нет. Никаких функций. Т.е. линкеру не никогда придется линковаться с его функциями (т.к. их нет)
|
| Автор: TaNK 23.9.2010, 16:49 | ||||||||
| Уважаемые, подскажите пожайлуста почему возникает ошибка main.h
кажется в абстрактном классе портит вот это объявление
экспортироваться будет
все остальное запихнул в АБС так как IsBigDiff ипользует в той или иной мере main.cpp
ругает меня компил на строку return new Date(); и пишет cannot allocate an object of abstract type 'Date' because the following virtual functions are pure within 'Date': virtual int ABS_date::datediff(ABS_date::datesign, ABS_date&, ABS_date&)| и пречисляет все мои вирт функции, как исправить...подскажите..пожайлуста |
| Автор: xvr 23.9.2010, 19:35 | ||||
Компилятор совершенно правильно ругается, разницу между
|
| Автор: mes 24.9.2010, 08:36 |
а также удаление после return.. |
| Автор: TaNK 24.9.2010, 09:33 | ||
| xvr - функцию datediff объявил так
но стал ругаться на то что класс ABS_date не имет членов year, month и day; А где создание объекта для g_date ? вот этот момент не понял совсем, поясните пожайлуста! |
| Автор: mes 24.9.2010, 11:19 |
советую почитать с чем едят указатели ) а в частности про new а в примере вместо указателя можно использовать сам объект, тогда и delеte не нужен будет.. |
| Автор: TaNK 24.9.2010, 11:28 | ||
Вы имеете ввиду вот это
Добавлено через 7 минут и 37 секунд mes - помогите дописать и осмыслить datediff, если Вам не сложно! |
| Автор: TaNK 24.9.2010, 15:26 |
| буду всем признателен, если подскажите как мне правильно передавать в подкласс название абстрактного класса для дальнейшого использования. Всем спасибо за ответы. |
| Автор: mes 24.9.2010, 16:04 | ||
так указанная проблема была с ф-цией IsBigDiff ? или опечатались ? тогда в чем проблема ? как убрать делете ? откажитесь от указателя, чтоб не портить логику или пользуйте std::auto_ptr<> - он сам удалит когда выйдете из функции.. код и тему внимательно не смотрел, но возникли два вопроса : 1. действительно ли Вам нужен абстрактный класс ? 2. если действительно нужно, то все поголовно далеко не обязательно делать виртуальным.. так в частности операторы сравнения легко разгружаются одной функцией. например так :
|
| Автор: xvr 24.9.2010, 18:04 | ||||||
Либо сделайте абстрактые методы для доступа к этим членам, либо приведите внутри класса параметры к типу Date& (в последнем случае нужно быть уверенным, что ничего кроме Date туда придти не сможет)
|
| Автор: TaNK 28.9.2010, 12:36 | ||
то что Вы мне изтолковали я переварил и осознал, а теперь возник следующий....вопрос...отдаю кому то dll без изходников, как человек сможет ее юзать , как должен получить адресс экспортируемой функции
cr_IsBigDiff - объявлено в header'e Спасибо за ответы |
| Автор: borisbn 28.9.2010, 12:47 | ||||
сам же и ответил а если серьёзно, то ты должен отдать человеку h-ник, в котором описан cr_IsBigDiff. Другими словами, человек, использующий твою dll-ку ( а именно функцию из неё ) должен знать как она должна вызываться, с какими параметрами и что возвращает. |
| Автор: TaNK 28.9.2010, 13:33 |
| т.е. если нет исходников dll, то ничего не получится я правильно понял? |
| Автор: borisbn 28.9.2010, 16:46 |
h-ник, а не исходники. Итого: 1. для подключения dll-ки в другой проект её исходники не нужны. 2. для подключения dll-ки в другой проект с ней ( как минимум ) должен поставляться h-ник, в котором должно быть описание экспортируемой функции ( функций ) 3. для динамического связывания п. 2 хватит. если хочешь связывать программу и dll-ку статически, то нужна ещё библиотека импорта ( lib-ина ) |