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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Программа падает, когда пытается явно загрузить DLL  (Прочитано 6013 раз)
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.
В чем может быть проблема?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Декабрь 20, 2004, 18:44 »

а дебагером не пробовал это все проходить
может он что скажет

явной ошибки я не нашел
Записан
46&two
Гость
« Ответ #2 : Декабрь 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
Записан
Gorthaur
Гость
« Ответ #3 : Ноябрь 23, 2005, 15:28 »

Я канешно понимаю, что тред уже старый но может кому пригодится решение этой проблемы...
Кажется если заменить
Код:
 
#define DLLCLASS_DLL __declspec(dllimport)

на                                                
                                                     
#define DLLCLASS_DLL __declspec(dllexport)
                                                     

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

regards, Gorthaur.
Записан
Garrett
Гость
« Ответ #4 : Ноябрь 24, 2005, 17:46 »

Гениально! :lol:
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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