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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: ActiveQt - сервер и клиент в dll  (Прочитано 12995 раз)
kirill
Гость
« Ответ #15 : Май 07, 2010, 05:54 »

Деструктор MainWindow не вызывается.
Так проблема в том, что не вызывается деструктор MainWindow?
А если "руками" удалить объект QAxWidget, то все нормально выгружается?


В общем так.
В класса MainWindow в протектед - указатель на QAxWidget.
Один слот создает экземпляр QAxWidget, второй удаляет. Дальше пытаюсь закрыть главное окно крестиком и вижу, что в деструктрор MainWindow мы не приходим. Окно тем не менее скрывается, но процесс остается в памяти и студия ждет его завершения. Приходится останавливать дебаг руками.

Далее, если я создам экземпляр QAxWidget в конструкторе MainWindow и установлю его в качестве центрального виджета, то закрытие по крестику главного окна вызовет деструктор и процесс нормально завершится.

Я от такого поведения в замешательстве.


Добавлю еще следующую вещь. В качестве ActiveX сервера создается опять же главное окно. То есть получаем главное окно вложенное в другое главное окно во втором случае, а в первом - из главного окна создается новое главное окно.
Подозреваю, что проблема в том, что новое главное окно имеет свой цикл обработки сообщений и он не завершается. Но это так, предположение.
« Последнее редактирование: Май 07, 2010, 05:59 от Kirill » Записан
Sanya
Гость
« Ответ #16 : Май 07, 2010, 06:33 »

Я в Qt недавно, но уже тоже по сталкивался с непонятным мне(возможно пока) поведением сигналов.
А если такое шаманство:
В конструкторе QMainWindow в центр поставить некоторый контейнер, допустим QWidget и создать. А вот уже в него встроить AxServer.
P.S.:
   Взять прям код и погонять мне тяжко - работы выше крыши, сорри.
Записан
BRE
Гость
« Ответ #17 : Май 07, 2010, 07:52 »

Дальше пытаюсь закрыть главное окно крестиком и вижу, что в деструктрор MainWindow мы не приходим.
Код
C++ (Qt)
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
...
MainWindow mw;
mw.show()
 
return app.exec();
}
 
В этом случае деструктор MainWindow будет вызываться.
Записан
kirill
Гость
« Ответ #18 : Май 07, 2010, 10:23 »

Дальше пытаюсь закрыть главное окно крестиком и вижу, что в деструктрор MainWindow мы не приходим.
Код
C++ (Qt)
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
...
MainWindow mw;
mw.show()
 
return app.exec();
}
 
В этом случае деструктор MainWindow будет вызываться.


хм.. именно так и делаю.
Это вроде как стандартная схема.
Записан
sy
Гость
« Ответ #19 : Май 27, 2010, 15:41 »

Я не очень уверен, что это связано с данной темой, но сегодня наткнулся на загадочное поведение
void QAxBase::internalRelease()
утилита dumpcpp вставляет эту процедуру в конструкторе класса-переходника к интерфейсу COM-сервера:
Код:
class PCKERNEL_EXPORT ITask : public QAxObject
{
public:
    ITask(IDispatch *subobject = 0, QAxObject *parent = 0)
    : QAxObject((IUnknown*)subobject, parent)
    {
         internalRelease();
    }
...
Так вот, если вызов этой функции отключить, то нарушений(скорее всего в стеке) в клиенте не происходит (не разваливается в непредсказуемых местах).
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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