Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
-NEURON-
Заблокирован
#1

Экспорт шаблонной функции из DLL - C++

26.08.2014, 13:20. Просмотров 979. Ответов 8
Метки нет (Все метки)

Привет!
В DLL есть класс и глобальная шаблонная функция, для получения интерфейса этого класса при динамическом подключение DLL:
C++
1
2
3
4
5
6
7
8
9
10
11
extern "C" class __declspec(dllexport) SuperClass
{
 
public:
    SuperClass();
};
 
template< class Type > __declspec(dllexport) Type* QueryInterface()
{
    return new Type;
}
Как написать typedef для получения хранения адреса этой функции в основном коде?

Вот с обычными функциями проблем нет, допустим в DLL есть функция int GetNum() { return 777; };
Для такой функции пишу:
C++
1
2
3
4
5
typedef int (__stdcall* GET_NUM)();
//потом получаю адрес (через что и под какую ОС - не важно
GET_NUM GetNum = (GET_NUM)SuperLib->ФУНКЦИЯ_ПОЛУЧЕНИЯ_АДРЕСА_ПО_ИМЕНИ;
//и всё, могу использовать
int test = GetNum();
А вот как быть с шаблонной функцией?
Допустим в DLL в одном файле у меня много определения классов, а экпортную функцию для интерфейсов классов хочу написать одну - шаблонную, т.к. не хочу писать под каждый класс QueryClass1Interface, QueryClass2Interface и т.д. Как в коде использовать шаблонную функцию из динамический подгружаемой DLL?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2014, 13:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Экспорт шаблонной функции из DLL (C++):

Экспортирование шаблонной функции из dll - C++
Использую mvs 2013 Весь вечер курил сайт microsoft по шаблонам и dll, никакого упоминания об экспортировании шаблонной функции из dll, не...

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

Создание dll-файла с шаблонной функцией - C++
Здравствуйте! Требуется создать .dll файл, который будет хранить в себе шаблонную функцию Вот код #ifndef _DLLTEST_H_ #define...

Вызов шаблонной функции - C++
Что я делаю не так? есть функция: template &lt;class T&gt; T rFF(string input_file) { string tmp; ifstream file(input_file); file...

Создание шаблонной функции - C++
Создать шаблонную функцию, изменяющий порядок элементов таким образом: первая половина списка смещается в конец, а вторая в начало. К...

Итераторы в шаблонной функции - C++
Здравствуйте, пишу программу, в ознакомительных целях с шаблонными функциями. У меня есть функция, вычисляющая среднее арифметическое. Как...

8
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
26.08.2014, 14:39 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Никак.
1
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
26.08.2014, 14:45 #3
C++
1
2
3
4
5
6
template< typename T >
 __declspec( dllimoprt ) T QueryInterface();
 
int main() {
   auto var = QueryInterface< Type >();
}
Если будете использовать определение шаблона, которое не было сгенерировано при компиляции dll, то получите undefined reference.
0
-NEURON-
Заблокирован
26.08.2014, 15:13  [ТС] #4
Цитата Сообщение от castaway Посмотреть сообщение
Никак.
Точно?
Цитата Сообщение от Toshkarik Посмотреть сообщение
template< typename T >
*__declspec( dllimoprt ) T QueryInterface();
мне нужен typedef, что к нему привести указатель функции DLL, это совсем не то.
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
26.08.2014, 15:30 #5
Ну так сделайте typedef, не вижу проблемы. Только вот как Вы собрались загружать ее с помощью ФУНКЦИЯ_ПОЛУЧЕНИЯ_АДРЕСА_ПО_ИМЕНИ - непонятно. Опишите подробней. Своя ли это функция или системная.
0
-NEURON-
Заблокирован
26.08.2014, 15:40  [ТС] #6
Цитата Сообщение от Toshkarik Посмотреть сообщение
Ну так сделайте typedef, не вижу проблемы
Ну а вот я вижу, т.к. у меня не получается обхитрить компилятор

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//КОД
QLibrary* lib = new QLibrary("SuperDLL");
if(lib && lib->load())
{
    typedef SuperDLL* (*QUERY_INTERFACE)();
    QUERY_INTERFACE QueryInterface = (QUERY_INTERFACE)lib->resolve("QueryInterface");
    if(QueryInterface != nullptr)
    {
        SuperDLL* m_pGui = QueryInterface();
        //Всё! Могу использовать класс :-)
    }
}
 
//В DLL
SuperDLL *QueryInterface()
{
    return new SuperDLL;
}
Ну это на Qt, хотя сути не меняет, т.к. под WinApi GetProcAdress делает тоже самое, что и resolve - возвращает адрес функции.
А вот как сделать функцию QueryInterface, не привязанную к конкретному классу ?
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
26.08.2014, 16:05 #7
Цитата Сообщение от -NEURON- Посмотреть сообщение
resolve("QueryInterface");
А как Вы это себе представляете? Все определения шаблона, по Вашему, под одним именем и адресом? Это не так. Это отдельные функции, после генерации они имеют разные имена, которые зависят от компилятора.
1
-NEURON-
Заблокирован
26.08.2014, 16:12  [ТС] #8
Цитата Сообщение от Toshkarik Посмотреть сообщение
А как Вы это себе представляете? Все определения шаблона, по Вашему, под одним именем и адресом? Это не так. Это отдельные функции, после генерации они имеют разные имена, которые зависят от компилятора.
ну именно по этому ответ
Цитата Сообщение от castaway Посмотреть сообщение
Никак.
мне сразу показался наиболее правильным Всем спасибо
0
MrCold
859 / 757 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
26.08.2014, 16:20 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от -NEURON- Посмотреть сообщение
Допустим в DLL в одном файле у меня много определения классов, а экпортную функцию для интерфейсов классов хочу написать одну
-NEURON-, вам нужны не шаблоны а фабрика классов
1
26.08.2014, 16:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2014, 16:20
Привет! Вот еще темы с ответами:

Объявление шаблонной функции - C++
Здравствуйте, встретил в учебнике это: template &lt;typename Type, int size&gt; Type min( Type (&amp;r_array) ) { //... }

Не вызывается специализация шаблонной функции - C++
Читаю книгу Прата, C++ Primer Plus. В ней есть следующее упражнение. Необходимо написать шаблонную функцию maxn(), которая принимает в...

Ошибка вызова шаблонной функции - C++ - C++
Читаю Прата, остановился на таком задании: Напишите функцию с интерфейсом в старом стиле, которая имеет следующий прототип: int...

Присваивание по ссылке в шаблонной функции - C++
такая проблема: при попытке скомпилировать следующий код //... template &lt;typename Type&gt; void input(Type&amp; result,int x, int y,...


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

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

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