C++ COM [in, out] 安全数组

Posted

技术标签:

【中文标题】C++ COM [in, out] 安全数组【英文标题】:C++ COM [in, out] safearrays 【发布时间】: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() 真正使用的原型是什么呢? 【参考方案1】:

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

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

【讨论】:

我在考虑你的代码。在您的示例中,您如何读取字符串列表?直接看list吗?还是for(int i=0; i&lt;parameters.at(0).toStringList().size(); i++) qDebug() &lt;&lt; parameters.at(0).toStringList().at(i); 【参考方案2】:

发现问题。这是读取结果的方式。我必须阅读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);

【讨论】:

以上是关于C++ COM [in, out] 安全数组的主要内容,如果未能解决你的问题,请参考以下文章

C# :- P/调用签名

C++并发编程----异常安全的并行算法(《C++ Concurrency in Action》 读书笔记)

C++并发编程----异常安全的并行算法(《C++ Concurrency in Action》 读书笔记)

将安全数组的安全数组从 C++ 中的 VARIANT 编组到 C#

使用 React 引用嵌套 Javascript 数组的列值

NumPy 学习: 数组的操作