关于 qt:C COM [in, out] safearrays

C++ COM [in, out] safearrays

我需要在 C 中调用一个返回对 SAFEARRAY(BSTR).

的引用的 COM 函数

根据这个文档,应该是:

1
2
3
4
5
6
7
8
9
10
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).


发现问题。这是读取结果的方式。我必须读取 parameters 的第一个元素,然后将其转换为 QStringList。我对我很生气:(

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
}


COM 对象的 Frequencies() 函数的声明与文档中的示例匹配,只是示例使用 SAFEARRAY(VARIANT) 而您的 COM 对象使用 SAFEARRAY(BSTR)。所以尝试将示例代码改编为字符串,例如:

1
2
3
4
5
QList<QString> list;
...
QList<QVariant> parameters;
parameters << QVariant(list);
object->dynamicCall("Frequencies(QList<QString>&)", parameters);