Я занимаюсь разработкой приложения на 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).
Любая идея?
Спасибо!
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
Работа.
Надеюсь, это поможет.
Пример 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
, Очень просто …
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, это отличный проект