Имеется проект на QT3.0, компилируемый с использованием MinGW под винду. Программа явно (explicitly) загружает динамическую библиотеку с использованием класса QLibrary. DLL хранит класс DllClass, который является наследником QWidget.
Экспортируемая из DLL функция createDllClassInstance() создает экземпляр класса DllClass и возвращяет указатель на него.
Код функции createDllClassInstance
QWidget* createDllClassInstance(QWidget *parent)
{
return new DllClass(parent);
}
Хидер с объявлением класса и экспортируемой функции:
#if !defined(DLLCLASS_DLL)
#define DLLCLASS_DLL __declspec(dllimport)
#endif
extern "C" DLLCLASS_DLL QWidget* createDllClassInstance(QWidget *parent);
class DLLCLASS_DLL DllClass: public QWidget
{
public:
DllClass(QWidget *);
virtual int foo() {return 0;}
};
Следующий код описывает, как программа загружает библиотеку и вызывает экспортируемую функцию.
QDir dir_p(".");
QLibrary *lib = NULL;
lib = new QLibrary(dir_p.absPath()+"/"+"DllClass.dll");
lib->load();
if(lib->isLoaded())
{
typedef QWidget* (*PCreateDllClassInstance)(QWidget*);
PCreateDllClassInstance func = (PCreateDllClassInstance) lib->resolve("createDllClassInstance");
if(func)
{
libptr = func(this); //creating instance of DllClass, this code causes the following crash.
}
}
Программа падает без единого сообщения об ошибке сразу по завершению этого кода. Однако, программа отлично работает, если DllClass не наследует QWidget или если createDllClassInstance не вызывает конструктор класса DllClass.
В чем может быть проблема?