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

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

26.08.2014, 13:20. Просмотров 1065. Ответов 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
Использую mvs 2013 Весь вечер курил сайт microsoft по шаблонам и dll, никакого...

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

Создание dll-файла с шаблонной функцией
Здравствуйте! Требуется создать .dll файл, который будет хранить в себе...

Объявление шаблонной функции
Здравствуйте, встретил в учебнике это: template &lt;typename Type, int size&gt;...

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

8
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
26.08.2014, 14:39 2
Лучший ответ Сообщение было отмечено -NEURON- как решение

Решение

Никак.
1
Toshkarik
1150 / 867 / 90
Регистрация: 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
1150 / 867 / 90
Регистрация: 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
1150 / 867 / 90
Регистрация: 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
861 / 759 / 174
Регистрация: 11.01.2012
Сообщений: 1,942
26.08.2014, 16:20 9
Лучший ответ Сообщение было отмечено -NEURON- как решение

Решение

Цитата Сообщение от -NEURON- Посмотреть сообщение
Допустим в DLL в одном файле у меня много определения классов, а экпортную функцию для интерфейсов классов хочу написать одну
-NEURON-, вам нужны не шаблоны а фабрика классов
1
26.08.2014, 16:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2014, 16:20

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

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

Вызов шаблонной функции
Здравствуйте. Есть такой код: template&lt;class _Ty1, class _Ty2&gt; inline...


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

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

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