Пишу программу подключения к 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 и все. Может быть надо еще как-то эту ситуацию обрабатывать?
Спасибо за ответы.