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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка при вызове функции COM сервера  (Прочитано 6248 раз)
AVR
Гость
« : Ноябрь 14, 2011, 21:53 »

Добрый вечер.
Ситуация такая: есть замечательный отечественный прибор "Ретом 51". Требуется написать программу управления прибором.
Операционка XP SP2.  Версия QT 4.7.4
Производитель предоставляет интерфейс для работы с прибором в виде COM сервера и кое-какое описание всего этого.
Делаю так:
создаю в QT Creator-е новый проект, прописываю в файле .pro:
 TYPELIBS = RTDI.tlb     ,где RTDI.tlb -файл, предоставленный производителем
dumpcpp создаёт файлы RTDI.cpp и RTDI.h. Подключаю их к проекту.
Вот файл ret.pro:
Код:
QT       += core gui

TARGET = ret
TEMPLATE = app

 CONFIG += qaxcontainer

 TYPELIBS = RTDI.tlb

SOURCES += main.cpp\
        mainwindow.cpp\
        RTDI.cpp

HEADERS  += mainwindow.h\
            RTDI.h

FORMS    += mainwindow.ui

В файле mainwindow.h прописываю:
using namespace RTDI;

Дальше :

 
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    IDualServer retom;
   
    retom.setControl("RTDI.DualServer"); //создаю экземпляр интерфейса
    //при этом в трее появляется иконка сервера

    QVariant *list=new QVariant;

    //Следующая функция должна получать список приборов, подключенных к компьютеру

    int rez=retom.Check(*list);  //при выполнении этой функции программа вылетает с сообщением Runtime Error!


    ui->setupUi(this);
}

Вот, что говорит о функции Check фирменная документация:
Цитировать
Check
long Check (VARIANT* vRTList);
Описание:
Осуществляет поиск подключенных к компьютеру приборов РЕТОМ-51.
Возвращаемое значение:
В случае успешного завершения ненулевое значение, в противном случае «0».
Параметры:
vRTList
Массив записей типа IRTListDevice, через который возвращается список подключенных приборов.

А так выглядит её прототип в файле RTDI.h:
Код:
inline int DualServer::Check(QVariant& vRTList)
{
    int qax_result;
    void *_a[] = {(void*)&qax_result, (void*)&vRTList};
    qt_metacall(QMetaObject::InvokeMetaMethod, 19, _a);
    return qax_result;
}

Вывод приложения при возникновении ошибки выглядит так:
Цитировать
ASSERT: "id < 0" in file c:\ndk_buildrepos\qt-desktop\src\activeqt\container\qaxbase.cpp, line 3717
Что это за файл такой qaxbase.cpp я так и не понял.

Второй день сижу. Много уже чего перечитал и перепробовал. Идеи кончились. Непонимающий Подскажите, в каком направлении ещё можно по копать.

Записан
pashandr
Гость
« Ответ #1 : Март 13, 2012, 13:21 »

AVR У меня такая же проблема, с такой же ошибкой вылетает приложение. Не знаю что делать.
Записан
Bepec
Гость
« Ответ #2 : Март 13, 2012, 13:35 »

Берём дебаггер. Запускаем. Идём по функциям и смотрим что у вас там творится.

Через 15 минут находим место ошибки. Невтупляем сами, зато выкладываем на форум.


Записан
popper
Гость
« Ответ #3 : Март 13, 2012, 23:19 »

попробуй заменить
Код:
QVariant *list=new QVariant;
на
Код:
IRTListDevice *list;
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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