Типы данных 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

Решение

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

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

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

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

Вот цитата из документации для 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 Работа.

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

1

Другие решения

Пример 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, Очень просто …

0

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, это отличный проект

0
По вопросам рекламы [email protected]