Russian Qt Forum

Qt => Вопросы новичков => Тема начата: alexandros от Март 02, 2012, 15:26



Название: Как создать обьект класса из DLL
Отправлено: 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. Обычные функции умею загружать хочу научится работать с классом


Название: Re: Как создать обьект класса из DLL
Отправлено: alexandros от Март 02, 2012, 15:37
выполнил dumpbin.exe

показал что 3 функции есть
  • конструктор
  • конструктор копирования
  • моя функция


Название: Re: Как создать обьект класса из DLL
Отправлено: Авварон от Март 02, 2012, 16:18
Используй QPluginLoader. Или сделай как там сделано. Лень объяснять как.


Название: Re: Как создать обьект класса из DLL
Отправлено: BRE от Март 02, 2012, 16:36
P.S. Обычные функции умею загружать хочу научится работать с классом
Если умеешь функции, то создай функцию, которая будет создавать объект нужного класса и возвращать на него указатель. Как бы все просто. :)

Код
C++ (Qt)
ClassDll *makeObject()
{
   return new ClassDll;
}
 


Название: Re: Как создать обьект класса из DLL
Отправлено: alexandros от Март 02, 2012, 21:06
неполучается так


Название: Re: Как создать обьект класса из DLL
Отправлено: BRE от Март 02, 2012, 21:08
неполучается так
Что именно не получается?


Название: Re: Как создать обьект класса из DLL
Отправлено: alexandros от Март 03, 2012, 08:24
нашел вот тут
http://www.rsdn.ru/article/baseserv/dlluse.xml

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

Сначала задумаемся, почему объекты класса из явно подключаемой библиотеки нельзя использовать, как обычно. Дело в том, что при создании объекта класса компилятор генерирует вызов его конструктора. Но линкер не может разрешить этот вызов, поскольку адрес конструктора будет известен только в процессе выполнения программы. В результате сборка программы закончится неудачно. Такая же проблема возникает при вызове невиртуальных методов класса. С другой стороны, вызов виртуальных методов возможен, так как он осуществляется через таблицу виртуальных функций (vtable). Так, следующий фрагмент откомпилируется и слинкуется нормально (хотя, конечно, вызовет ошибку в процессе выполнения):


Название: Re: Как создать обьект класса из DLL
Отправлено: BRE от Март 03, 2012, 09:37
тупиковая ситуация
::) Настолько ли она тупиковая?
Да, простое создание объекта класса, методы которого лежат в разделяемой библиотеке и которая загружается в процессе работы программы - невозможно. Но всегда можно воспользоваться функцией-фабрикой, которая будет их создавать. Чем, собственно, все и пользуются.


Название: Re: Как создать обьект класса из DLL
Отправлено: alexandros от Март 03, 2012, 16:45
Теперь я разобрался окончательно. Всем спасибо. Закрываю. :)