Типы данных Qt ActiveX

Я занимаюсь разработкой приложения на C++/Qt, которое взаимодействует с сервером ActiveX. Я пытаюсь использовать функцию, которая возвращает ссылку на массив с плавающей точкой в ​​качестве параметра. Прототип функции:

Frequencies([in, out] SAFEARRAY(float)*)

Мой код:

QList<QVariant> variantList;
object->dynamicCall("Frequencies(QList<QVariant>&)", variantList);

Но, к сожалению, у меня есть следующая ошибка: Type Mismatch in Parameter. Pass an array of type string or real.

После прочтения этого документа я также попытался QList<QString>& а также QList<float>& без успеха.

Документация сервера ActiveX гласит: Use a safearray of strings (VT_BSTR) or reals (VT_R8 for double or VT_R4 for float).

Любая идея?

Спасибо!

3 ответа

Решение

Пример Qt не показывает, как читать результаты. Это была моя проблема...

QList<QString> values;
for(int i=0; i<nbFrequencies; i++) {
    values << "0.0";
}
QList<QVariant> variantList;
parameters << QVariant(values);
object->dynamicCall("Frequencies(QList<QString>&)", variantList);

values = variantList.first().toStringList();

for(int j=0; j<values.size(); j++) {
    qDebug() << values.at(j);
}

Надо прочитать первый элемент variantList и преобразовать его в QStringList, Очень просто...

http://qt-project.org/doc/qt-4.8/activeqt.html

Модули ActiveQt являются частью коммерческой версии Qt и версий Qt с открытым исходным кодом.

http://qt-project.org/doc/qt-4.8/qaxobject.html

http://qt-project.org/doc/qt-4.8/qaxbase.html

Вот цитата из документации для QAXBase:

Для вызова методов COM-интерфейса описывается следующий IDL

dispinterface IControl
{
properties:
    [id(1)] BSTR text;
    [id(2)] IFontDisp *font;

methods:
    [id(6)] void showColumn([in] int i);
    [id(3)] bool addColumn([in] BSTR t);
    [id(4)] int fillList([in, out] SAFEARRAY(VARIANT) *list);
    [id(5)] IDispatch *item([in] int i);
};

использовать QAxBase API, как это:

QAxObject object("<CLSID>");

QString text = object.property("text").toString();
object.setProperty("font", QFont("Times New Roman", 12));

connect(this, SIGNAL(clicked(int)), &object, SLOT(showColumn(int)));
bool ok = object.dynamicCall("addColumn(const QString&)", "Column 1").toBool();

QList<QVariant> varlist;
QList<QVariant> parameters;
parameters << QVariant(varlist);
int n = object.dynamicCall("fillList(QList<QVariant>&)", parameters).toInt();

QAxObject *item = object.querySubItem("item(int)", 5);

Обратите внимание, что QList объект должен заполняться должен быть представлен как элемент в списке параметров QVariants,

В общем, вам нужно убедиться, что вы вложили QList, чтобы SAFEARRAY Работа.

Надеюсь, это поможет.

QT на avtivex работает не так хорошо. Он просто использует интерфейс IDispatch для вызова метода или свойства. С помощью элемента управления activex вы можете импортировать библиотеку MFC, а затем использовать член InvokeHelper COleDispatchDriver, чтобы вызвать метод. Просто так:

IDispatch* map_itf = NULL;
map_ctrl_->queryInterface(IID_IDispatch,(void**)&map_itf);

if(map_itf)
{
    COleDispatchDriver driver(map_itf,FALSE);

    static BYTE parms[] =
        VTS_PR4 VTS_PR4 VTS_PR8 VTS_PR8 VTS_I2;

    driver.InvokeHelper(0x22, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
        &screen_x, &screen_y, &map_x, &map_y, miScreenToMap);
}

Наслаждайтесь QT, это отличный проект

Другие вопросы по тегам