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).
- 返回 SAFEARRAY,还是返回对 SAFEARRAY 的引用? COM 实际上做出了这种区分。 "Frequencies()" 的实际声明在 COM 对象中是什么样的?
-
返回对 SAFEARRY 的引用。原型是:Frequencies([in, out] SAFEARRAY(VT_BSTR)*)。
-
您是否尝试过将 list 变量package在 QList/QVariant 中,就像链接文档在其 SAFEARRAY 输入/输出示例中显示的那样?文档说:"请注意,对象应填充的 QList 必须作为 QVariants 参数列表中的元素提供。"
-
还有什么想法吗?函数 print 是 void Frequencies(VARIANT* FrequencyArray);。
-
那不是你之前展示的。将指针传递给 SAFEARRAY 和将指针传递给 VARIANT 之间有很大的区别。那么 Frequencies() 真正使用的实际原型是什么?
-
我有点困惑。文档说 Use a safearray of strings (VT_BSTR) or reals (VT_R8 for double or VT_R4 for float) 但硬件似乎显示接口 void Frequencies(VARIANT* FrequencyArray); (通过 Oleview.exe 看到)。事实上,如果我将 QVariant 或 QList<Variant> 传递给 Frequencies,它会返回 Type Mismatch in Parameter. Pass an array of type string or real.。如果我通过 QStringList 我没有错误,但值没有更新。我能做什么?我不知道... :(
-
我不使用Qt,所以我没有想法。我直接使用 ActiveX/COM 接口,因此不会受到这些package问题的困扰。
-
我在这里找到了同样问题的人。我想我会这样做。但遗憾的是 Qt 不允许这样做。
发现问题。这是读取结果的方式。我必须读取 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); |
- 我在想你的代码。在您的示例中,您如何读取字符串列表?直接看list吗?还是 for(int i=0; i<parameters.at(0).toStringList().size(); i++) { qDebug() << parameters.at(0).toStringList().at(i); } ?