Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Brendon
Заблокирован
#1

Экспорт класса DLL - C++

17.08.2014, 16:00. Просмотров 1076. Ответов 11
Метки нет (Все метки)

Привет
Есть DLL:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
 
class DLL_API CDll {
public:
    CDll(void);
    int XXX();
};
 
extern "C" DLL_API CDll* GetPointer();

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include "Dll.h"
 
DLL_API CDll* GetPointer()
{
    return new CDll();
}
 
CDll::CDll()
{   
}
 
int CDll::XXX()
{
    return 777;
}

В коде пытаюсь использовать функции экспортируемого из DLL класса:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include "../Dll/Dll.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    HMODULE hModul = LoadLibrary(L"Dll.dll");
    if (hModul)
    {
        typedef CDll* (WINAPI *GetPointer)(void);
        GetPointer pointer = (GetPointer)GetProcAddress(hModul, "fnDll");
        CDll *dll = pointer();
        int x = dll->XXX();     
    }
 
    return 0;
}

но компилятор не даёт это сделать и пишет:
error LNK2019: unresolved external symbol "__declspec(dllimport) public: int __thiscall CDll::XXX(void)" (__imp_?XXX@CDll@@QAEHXZ) referenced in function _wmain

В чём фикус - то?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2014, 16:00
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Экспорт класса DLL (C++):

Экспорт классов из DLL
Привет. Вот так я экспортирую обычные ф-ии: main.h #ifndef __MAIN_H__...

Экспорт функции из dll
Здравствуйте! Сейчас изучаю экспорты функций из dll-ок. Функцию без параметров...

Экспорт шаблонной функции из DLL
Привет! В DLL есть класс и глобальная шаблонная функция, для получения...

Экспорт классов из dll библиотек (Visual Studio)
Здравствуйте! Подскажите, как такой код вставить в dll файл и загрузить его в...

Вызов метода класса из DLL
Добрый вечер. Имеется длл, в которой есть: 1. Класс, содержащий метод 2....

Создание экземпляра класса из DLL
Привет всем, Подскажите, пожалуйста, как создать экземпляр класса из DLL? В...

11
-=ЮрА=-
Заблокирован
Автор FAQ
17.08.2014, 16:28 #2
Если совсем по простому

Не по теме:

Цитата Сообщение от Brendon Посмотреть сообщение
В чём фикус - то?
- если вркатце - ты собрался достать нестатическую функцию класса

0
Миниатюры
Экспорт класса DLL  
Вложения
Тип файла: rar ClassExport.rar (1.20 Мб, 17 просмотров)
Тип файла: rar ClassImport.rar (2.31 Мб, 18 просмотров)
Brendon
Заблокирован
17.08.2014, 16:33  [ТС] #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
если вркатце - ты собрался достать нестатическую функцию класса
Чего?

Что за охинею ты тут понаписывал Ты в своём примере подключаешь статическую библиотеку, да и вообще, ты сверху, над функцией main описал класс и в main его статический используешь ... Посмотри внимательней в мой случай, как мне - то проблему решить?
0
-=ЮрА=-
Заблокирован
Автор FAQ
17.08.2014, 16:47 #4
Цитата Сообщение от Brendon Посмотреть сообщение
Ты в своём примере подключаешь статическую библиотеку, да и вообще, ты сверху, над функцией main описал класс и в main его статический используешь ... Посмотри внимательней в мой случай, как мне - то проблему решить?
- я импортирую твой класс из длл(неявное подключение если не слышал )
0
Brendon
Заблокирован
17.08.2014, 17:04  [ТС] #5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
я импортирую твой класс из длл,
ты статическую либу подключаешь )))))

Добавлено через 6 минут
так кто - то может помочь мне с проблемой в первом посте ?
0
-=ЮрА=-
Заблокирован
Автор FAQ
17.08.2014, 17:20 #6
Цитата Сообщение от Brendon Посмотреть сообщение
ты статическую либу подключаешь )))))
- да ты что,
http://msdn.microsoft.com/ru-ru/library/9yd93633.aspx
http://msdn.microsoft.com/ru-ru/library/d14wsce5.aspx
попробуй удалить из папки проекта dll-ку.
Цитата Сообщение от Brendon Посмотреть сообщение
так кто - то может помочь мне с проблемой в первом посте ?
- уж точно показывать явное подключение тебе не стану.
0
Brendon
Заблокирован
17.08.2014, 18:01  [ТС] #7
Что - то я вообще усомнился в возможности экспорта класса из динамической библиотеки...
Кто - нибуть может объяснить, что тут делает префикс DLL_API класса ? Как этот класс ипортировать в основной программе ?
C++
1
2
3
4
5
6
7
8
9
10
11
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
 
class DLL_API CDll {
public:
    CDll(void);
    int XXX();
};
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
17.08.2014, 19:03 #8
Лучший ответ Сообщение было отмечено Brendon как решение

Решение

Цитата Сообщение от Brendon Посмотреть сообщение
Что - то я вообще усомнился в возможности экспорта класса из динамической библиотеки...
Не забудь добавить в dll в свойства проекта препроцессорное предопределение DLL_EXPORTS.
Функцию XXX надо бы сделать виртуальной.
Остальное вроде все правильно. По поводу волшебного условия с DLL_EXPORTS, можешь тут почитать, я не собираюсь еще раз все это писать
1
Brendon
Заблокирован
17.08.2014, 19:06  [ТС] #9
По сути дела я могу импортировать класс из загруженной DLL только если я подгружу в проект так же статическую версию этой DLL, то есть LIB файл, но какой - тогда прок от этой DLL, если она всё равно в код вкомпилится, единственный плюс - можно выгрузить её и заново загрузить.
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
17.08.2014, 19:10 #10
Цитата Сообщение от Brendon Посмотреть сообщение
По сути дела я могу импортировать класс из загруженной DLL только если я подгружу в проект так же статическую версию этой DLL
Я тебе выше написал способ, чтобы этого не делать
Попробуй.
1
Brendon
Заблокирован
17.08.2014, 19:19  [ТС] #11
Цитата Сообщение от DrOffset Посмотреть сообщение
Не забудь добавить в dll в свойства проекта препроцессорное предопределение DLL_EXPORTS.
А оно там и так торчит по умолчанию про создание проекта DLL в 2013-й студии.
Цитата Сообщение от DrOffset Посмотреть сообщение
Функцию XXX надо бы сделать виртуальной.
ЧЁРТ ПОДЕРИ! Заработало! А почему эта функция должны быть виртуальной - то не пойму ?
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
17.08.2014, 19:35 #12
Цитата Сообщение от Brendon Посмотреть сообщение
А почему эта функция должны быть виртуальной - то не пойму ?
Тут.
1
17.08.2014, 19:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2014, 19:35
Привет! Вот еще темы с решениями:

Ссылка на экземпляр класса в DLL
Написал маленький каркасик для собственново фреймворка, и проблема возникла...

Определение класса в DLL - ипользование вне и динамически
Однажды я уже задавал подобный ворос, ответа так и не получил. В свое время я...

Можно ли создать объект экспортируемого из DLL класса без лишних манипуляций?
Привет! Есть DLL, экспортирую из неё класс, можно ли в коде, имея header...

Неразрешенный внешний символ при вызове методов класса в сторонней программе (dll)
Здравствуйте. Пишу dll для клавиатурного хука. Есть класс, который я написал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru