【发布时间】:2013-06-12 16:33:25
【问题描述】:
我需要在 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)。
【问题讨论】:
-
返回
SAFEARRAY,还是返回对SAFEARRAY的引用? COM 实际上做出了这种区分。 “Frequencies()”的实际声明在 COM 对象中是什么样的? -
返回对
SAFEARRY的引用。原型为:Frequencies([in, out] SAFEARRAY(VT_BSTR)*)。 -
您是否尝试过将
list变量包装在QList/QVariant中,就像链接文档在其SAFEARRAY输入/输出示例中显示的那样?文档说:“请注意,对象应填充的 QList 必须作为 QVariants 参数列表中的元素提供。” -
还有其他想法吗?函数打印是
void Frequencies(VARIANT* FrequencyArray);。 -
这不是你之前展示的。将指针传递给
SAFEARRAY和将指针传递给VARIANT之间有很大的区别。那么Frequencies()真正使用的原型是什么呢?
标签: c++ qt com safearray qaxobject