Russian Qt Forum

Qt => Общие вопросы => Тема начата: 46&two от Декабрь 20, 2004, 18:08



Название: Программа падает, когда пытается явно загрузить DLL
Отправлено: 46&two от Декабрь 20, 2004, 18:08
Имеется проект на 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.
В чем может быть проблема?


Название: Программа падает, когда пытается явно загрузить DLL
Отправлено: Admin от Декабрь 20, 2004, 18:44
а дебагером не пробовал это все проходить
может он что скажет

явной ошибки я не нашел


Название: Программа падает, когда пытается явно загрузить DLL
Отправлено: 46&two от Декабрь 21, 2004, 09:11
Пробовал, разумеется :)
Но дебаггер в ответ запрос стека показывает следующее:
Program recieved signal SIGSEGV, segmentation fault.

in _libmcvsrt_a_iname ()

#0 in _libmcvsrt_a_iname ()
#1 ??
#2 in _libmcvsrt_a_iname ()
#3 in _libmcvsrt_a_iname ()
#4 in _libmcvsrt_a_iname ()
#5 in _libmcvsrt_a_iname ()
#6 in _libmcvsrt_a_iname ()
#7 in _libmcvsrt_a_iname ()
#8 in _libmcvsrt_a_iname ()
#9 in main at main.cpp:24


Название: Программа падает, когда пытается явно загрузить DLL
Отправлено: Gorthaur от Ноябрь 23, 2005, 15:28
Я канешно понимаю, что тред уже старый но может кому пригодится решение этой проблемы...
Кажется если заменить
Код:
 
#define DLLCLASS_DLL __declspec(dllimport)

на                                                
                                                     
#define DLLCLASS_DLL __declspec(dllexport)
                                                     

в хидере, то вылетание проги может прекратится

regards, Gorthaur.


Название: Программа падает, когда пытается явно загрузить DLL
Отправлено: Garrett от Ноябрь 24, 2005, 17:46
Гениально! :lol: