qt — C ++ COM [in, out] safearrays

Мне нужно вызвать функцию COM в C ++, которая возвращает ссылку на SAFEARRAY(BSTR),

В соответствии с этот документ, так должно быть:

QAxObject object = new QAxObject(...);
QStringList list;

for(int i=0; i<goodSize; i++)
list << "10.0";

object->dynamicCall("Frequencies(QStringList&)", list);

for(int i=0; i<list.size(); i++)
qDebug() << list.at(i);

но элементы списка остаются 10.0,

Я что-то пропустил?

РЕДАКТИРОВАТЬ

Я использовал Oleview.exe и на самом деле функция выглядит так: void Frequencies(VARIANT* FrequencyArray);,

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

0

Решение

Объявление объекта COM Frequencies() Функция соответствует примеру в документ, за исключением того, что в примере используется SAFEARRAY(VARIANT) и ваш COM-объект использует SAFEARRAY(BSTR) вместо. Поэтому попробуйте адаптировать пример кода для строк, например:

QList<QString> list;
...
QList<QVariant> parameters;
parameters << QVariant(list);
object->dynamicCall("Frequencies(QList<QString>&)", parameters);
0

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

Нашел проблему. Это был способ прочитать результаты. Я должен был прочитать первый элемент parameters затем преобразовать его в QStringList, Я злюсь на меня 🙁

IBKDataSet *data = function->FunctionData();
int nbFrequencies = data->dynamicCall("GetNumberOfXAxisEntries()").toInt();
QList<QString> frequencies;
for(int i=0; i<nbFrequencies; i++) {
frequencies << "0.0";
}
QList<QVariant> parameters;
parameters << QVariant(frequencies);
data->dynamicCall("Frequencies(QList<QString>&)", parameters);
frequencies = parameters.first().toStringList();
for(int j=0; j<frequencies.size(); j++) {
qDebug() << frequencies.at(j);
}
0

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