Russian Qt Forum
Ноябрь 24, 2024, 11:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как создать обьект класса из DLL  (Прочитано 4187 раз)
alexandros
Гость
« : Март 02, 2012, 15:26 »

Как создать обьект класса

имею dll

и эти файлы

classdll_global.h
Код
C++ (Qt)
#ifndef CLASSDLL_GLOBAL_H
#define CLASSDLL_GLOBAL_H
 
#include <QtCore/qglobal.h>
 
#if defined(CLASSDLL_LIBRARY)
#  define CLASSDLLSHARED_EXPORT Q_DECL_EXPORT
#else
#  define CLASSDLLSHARED_EXPORT Q_DECL_IMPORT
#endif
 
#endif // CLASSDLL_GLOBAL_H
 
 
classdll.h
Код
C++ (Qt)
#ifndef CLASSDLL_H
#define CLASSDLL_H
 
#include "ClassDll_global.h"
 
class __declspec(dllexport) ClassDll {
public:
   ClassDll();
   void say();
};
 
#endif // CLASSDLL_H
 
 

classdll.cpp
Код
C++ (Qt)
#include "classdll.h"
#include <iostream>
 
ClassDll::ClassDll()
{
   std::cout<<"Hello Shit! Im Class";
}
 
void ClassDll::say(){
   std::cout<<"Hello Shit!";
}
 
 

загружаю библиотеку через QLibrary() все прекрасно грузится - теперь нужно как то создать обьект, вызвать констрктор и функцию

P.S. Обычные функции умею загружать хочу научится работать с классом
Записан
alexandros
Гость
« Ответ #1 : Март 02, 2012, 15:37 »

выполнил dumpbin.exe

показал что 3 функции есть
  • конструктор
  • конструктор копирования
  • моя функция
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Март 02, 2012, 16:18 »

Используй QPluginLoader. Или сделай как там сделано. Лень объяснять как.
Записан
BRE
Гость
« Ответ #3 : Март 02, 2012, 16:36 »

P.S. Обычные функции умею загружать хочу научится работать с классом
Если умеешь функции, то создай функцию, которая будет создавать объект нужного класса и возвращать на него указатель. Как бы все просто. Улыбающийся

Код
C++ (Qt)
ClassDll *makeObject()
{
   return new ClassDll;
}
 
Записан
alexandros
Гость
« Ответ #4 : Март 02, 2012, 21:06 »

неполучается так
Записан
BRE
Гость
« Ответ #5 : Март 02, 2012, 21:08 »

неполучается так
Что именно не получается?
Записан
alexandros
Гость
« Ответ #6 : Март 03, 2012, 08:24 »

нашел вот тут
http://www.rsdn.ru/article/baseserv/dlluse.xml

тупиковая ситуация

Сначала задумаемся, почему объекты класса из явно подключаемой библиотеки нельзя использовать, как обычно. Дело в том, что при создании объекта класса компилятор генерирует вызов его конструктора. Но линкер не может разрешить этот вызов, поскольку адрес конструктора будет известен только в процессе выполнения программы. В результате сборка программы закончится неудачно. Такая же проблема возникает при вызове невиртуальных методов класса. С другой стороны, вызов виртуальных методов возможен, так как он осуществляется через таблицу виртуальных функций (vtable). Так, следующий фрагмент откомпилируется и слинкуется нормально (хотя, конечно, вызовет ошибку в процессе выполнения):
Записан
BRE
Гость
« Ответ #7 : Март 03, 2012, 09:37 »

тупиковая ситуация
Строит глазки Настолько ли она тупиковая?
Да, простое создание объекта класса, методы которого лежат в разделяемой библиотеке и которая загружается в процессе работы программы - невозможно. Но всегда можно воспользоваться функцией-фабрикой, которая будет их создавать. Чем, собственно, все и пользуются.
Записан
alexandros
Гость
« Ответ #8 : Март 03, 2012, 16:45 »

Теперь я разобрался окончательно. Всем спасибо. Закрываю. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.119 секунд. Запросов: 23.