Russian Qt Forum

Qt => ActiveX => Тема начата: dd от Июль 24, 2011, 13:29



Название: Программа падает при работе с объектом
Отправлено: dd от Июль 24, 2011, 13:29
Пишу программу подключения к 1с v8.2.
Там все просто, подключаемся к зарегистрированному объекту, обращаемся к нему.
Все работает, только возможно у меня не хватает понимания работы с COM.

Чтобы описать проблему, сделал очищенный вариант программы. Создаю чистый проект.
В конструкторе главного окна пишу:

Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QTimer *pTimer = new QTimer(this);
    pTimer->setSingleShot(false);
    connect(pTimer, SIGNAL(timeout()), this, SLOT(slotAxConnect()));
    pTimer->setInterval(1000 * 1);
    pTimer->start();
}

Далее сам слот:

Код:
void MainWindow::slotAxConnect()
{
    if(m_AxObject.isNull())     // m_AxObject - QAxObject, член класса главного окна
    {
        bool res = m_AxObject.setControl("V82.COMConnector");  // подключаемся к объекту

        if(!res)
        {
            qDebug() << "Can't connect to 'V82.COMConnector'. Exiting.";
            return;
        }
    }

    qDebug() << m_AxObject.isNull();  // на данном этапе подключились удачно

    if(!m_AxObject.isNull())
    {
        QAxObject *pServ = m_AxObject.querySubObject("Connect(QString)", QVariant(tr("_TROKA_POFKLUCHENIYA_")));   // эта строка
    }
}

_TROKA_POFKLUCHENIYA_ - это стандартная строка подключения.
Что в ней находится не важно, допустим она неправильная или пустая вообще.
По логике программы m_AxObject.querySubObject возвращает NULL по таймеру постоянно (строка специально неправильно указана).
Все в прядке.

Но если в взять мышкой окно и передвинуть, программа вылетает с ошибкой. Также падает при закрытии программы.
Если вышеуказанную строку закомментировать, этого не происходит.

Прикол в том, что если указать строку подключения нормально, все подключается и работает. Но в какой-то момент все равно падает.
Если строка не правильно указана, просто функция возвращает NULL и все. Может быть надо еще как-то эту ситуацию обрабатывать?

Спасибо за ответы.