Доброго времени суток всем=)
Не подскажет ли кто можно ли в динамической библиотеке в классе объявлять Слоты. Библиотека подключается по механизму позднего связывания. Методы класса виртуальные и не экспортируются из длл, вообще из длл экспортируется только одна функция которая возвращает объект класса.
вот исходники длл
"Dllclass.h"
#ifndef DLLCLASS_H
#define DLLCLASS_H
class Dllclass {
public:
Dllclass();
public:
void virtual temp();
};
#endif // DLLCLASS_H
"Dllclass.cpp"
#include "dllclass.h"
#include <iostream>
#include "stdio.h"
#include "conio.h"
#include "dllclass_global.h"
Dllclass::Dllclass()
{
}
void Dllclass::temp()
{
std::cout << "Load OK Hello From DLL" << std::endl;
}
FUNC_EXPORT Dllclass* test()
{
return new Dllclass();
}
"dllclass_global.h"
#ifndef DLLCLASS_GLOBAL_H
#define DLLCLASS_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(DLLCLASS_LIBRARY)
# define FUNC_EXPORT extern "C" Q_DECL_EXPORT __declspec(dllexport)
#else
# define FUNC_EXPORT extern "C" Q_DECL_IMPORT __declspec(dllexport)
#endif
#endif // DLLCLASS_GLOBAL_H
Клиент класса
#include <QtCore/QCoreApplication>
#include <QLibrary>
#include "../dllclass/dllclass.h"
#include <iostream>
#include "stdio.h"
#include "conio.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QLibrary mylib("dllclass");
if(mylib.load())
{
typedef Dllclass* (*MYFUNCTION)();
MYFUNCTION test = (MYFUNCTION) (mylib.resolve("test"));
if(test)
{
std::cout << "Function Loaded OK" << std::endl;
Dllclass *v = test();
v->temp();
}
else
{
std::cout << "Function Not Loaded" << std::endl;
}
//===================================================
mylib.unload();
getch();
return 0;
}
else
{
std::cout << "Load failed!!!" << std::endl;
return -1;
}
return a.exec();
}
Так всё работает, но возникла необходимость использовать механизм Сигналов-Слотов и интересует возможно ли вообще при таком позднем связывании использовать его. Вопрос может и не возник бы но если написать вот так
#ifndef DLLCLASS_H
#define DLLCLASS_H
#include <QObject> //<----
class Dllclass {
Q_OBJECT //<----
public:
Dllclass();
public slots:
void virtual temp(); //<----
};
#endif // DLLCLASS_H
то не работает говорит мол неправильно объявлен слот или сигнал. Я так понял что сигналы и слоты не могут быть виртуальными=((, но всё таки может кто сталкивался и как то решил эту проблему.
З.Ы. Вариант с промежуточным классом лоадером тоже неплохо но если в классе добавиться еще слоты или сигналы то нужно и в лоадере их тоже описывать.
Заранее спасибо всем=)