我需要在C ++中调用COM函数,该函数返回对SAFEARRAY(BSTR)
的引用。
根据this document,它应该是:
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 :(得分:0)
COM对象Frequencies()
函数的声明与document中的示例匹配,但示例使用SAFEARRAY(VARIANT)
而COM对象使用SAFEARRAY(BSTR)
。因此,尝试调整字符串的示例代码,例如:
QList<QString> list;
...
QList<QVariant> parameters;
parameters << QVariant(list);
object->dynamicCall("Frequencies(QList<QString>&)", parameters);
答案 1 :(得分: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);
}