![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
TaNK |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
Уважаемые, прочитал уйму статей в интернете, но все равно не пойму как реализовать сабж.
main.h
main.cpp
запустил code::blocks 10.05 и получили dll не пойму как вызвать из основной проги с помощью LoadLibrary и обраться к функции класса Print(); -------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Раз ты экспортируешь класс, то ты должен его импортировать, а LoadLibrary здесь не нужна.
Просто включаешь в основной программе твой main.h, подключаешь lib-файл, полученный при сборке dll-ки и просто используешь класс. типа того:
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
borisbn - у меня code::blocks не создает *.lib а есть что то типа
libDLL.dll.a libDLL.dll.def -------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
А ещё лучше создать интерфейс, наследоваться от него ( реализовать имплементацию ), создать и экспортировать всего одну функцию, создающую имплементацию.
А в основной программе:
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
virtual IFace() {} - ругается что конструктор не может быть виртуальным...убрать определение virtual?
-------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
TaNK, пардон. это должен был быть виртуальный деструктор
и то же самое с
стучи в жаббер, чтобы не захламлять форум Это сообщение отредактировал(а) borisbn - 22.9.2010, 14:36 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
Я запутался....можно ли увидеть приведенный пример уже готовй со всеми файлами....а т я не пойму что к чему должно бытьпривязано...огромное спасибо
-------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
TaNK |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
прошу прощения все получилось....был невнимателен!
Добавлено через 3 минуты и 41 секунду main.h
main1.h
main.cpp
запускаем main.cpp - получчаем dll в основной проге
borisbn + 1 -------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
||||||||
|
|||||||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Поздравляю. До повторного изобретения COM'а остался один шаг (GUID + QueryInterface)
![]() |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
![]() правда эта конструкция кроссплатформенная, а подсмотрел её я действительно из COM'а, выкинув GUID, QueryInterface и обращение к реестру -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
Уважаемые, а скажите а зачем делать класс абстрактным?
и еще пример class Date(){}; class subdate: public Date { // } мне нужен тип Date, но обратиться я не могу т.к. в Date объвлена чистая виртуальная функуия, как быть в этом случае, какой тип использовать в классе subdate -------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 3 Всего: 106 |
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Что бы наследники не забыли их определить
Отдельно стоит случай абстрактного класса, состоящего ИСКЛЮЧИТЕЛЬНО из чисто виртуальных функций (пример interface'а). Такой класс можно безопасно экспортировать куда угодно, т.к. де факто в нем кроме таблицы виртуальных функций (причем оригинальная VTBL этого класса НИКОГДА не будет использоваться) вообще ничего нет. Никаких функций. Т.е. линкеру не никогда придется линковаться с его функциями (т.к. их нет)
|
|||
|
||||
TaNK |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
Уважаемые, подскажите пожайлуста почему возникает ошибка
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&)| и пречисляет все мои вирт функции, как исправить...подскажите..пожайлуста -------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
||||||||
|
|||||||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Компилятор совершенно правильно ругается, разницу между
|
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
xvr - функцию datediff объявил
так
но стал ругаться на то что класс ABS_date не имет членов year, month и day; А где создание объекта для g_date ? вот этот момент не понял совсем, поясните пожайлуста! -------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
советую почитать с чем едят указатели ) а в частности про new а в примере вместо указателя можно использовать сам объект, тогда и delеte не нужен будет.. ![]() |
|||
|
||||
TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
Вы имеете ввиду вот это
Добавлено через 7 минут и 37 секунд mes - помогите дописать и осмыслить datediff, если Вам не сложно! -------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
буду всем признателен, если подскажите как мне правильно передавать в подкласс название абстрактного класса
для дальнейшого использования. Всем спасибо за ответы. -------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
так указанная проблема была с ф-цией IsBigDiff ? или опечатались ? тогда в чем проблема ? как убрать делете ? откажитесь от указателя, чтоб не портить логику или пользуйте std::auto_ptr<> - он сам удалит когда выйдете из функции.. код и тему внимательно не смотрел, но возникли два вопроса : 1. действительно ли Вам нужен абстрактный класс ? 2. если действительно нужно, то все поголовно далеко не обязательно делать виртуальным.. так в частности операторы сравнения легко разгружаются одной функцией. например так :
Это сообщение отредактировал(а) mes - 24.9.2010, 20:30 |
|||
|
||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Либо сделайте абстрактые методы для доступа к этим членам, либо приведите внутри класса параметры к типу Date& (в последнем случае нужно быть уверенным, что ничего кроме Date туда придти не сможет)
|
||||||
|
|||||||
TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
то что Вы мне изтолковали я переварил и осознал, а теперь возник следующий....вопрос...отдаю кому то dll без изходников, как человек сможет ее юзать , как должен получить адресс экспортируемой функции
cr_IsBigDiff - объявлено в header'e Спасибо за ответы -------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
сам же и ответил ![]() а если серьёзно, то ты должен отдать человеку h-ник, в котором описан cr_IsBigDiff. Другими словами, человек, использующий твою dll-ку ( а именно функцию из неё ) должен знать как она должна вызываться, с какими параметрами и что возвращает. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
TaNK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 669 Регистрация: 29.10.2006 Где: Краснодар Репутация: нет Всего: 1 |
т.е. если нет исходников dll, то ничего не получится я правильно понял?
-------------------- Oracle 11.2.0.3.0 FireBird 1.0-2.5 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
h-ник, а не исходники. Итого: 1. для подключения dll-ки в другой проект её исходники не нужны. 2. для подключения dll-ки в другой проект с ней ( как минимум ) должен поставляться h-ник, в котором должно быть описание экспортируемой функции ( функций ) 3. для динамического связывания п. 2 хватит. если хочешь связывать программу и dll-ку статически, то нужна ещё библиотека импорта ( lib-ина ) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |