迭代COM集合没有foreach或.Item()

问题描述:

我需要在Matlab中迭代COM集合。在VB中,我可以使用For Each item In Collection;在Python中,我可以使用for item in Collection。但不幸的是,这样的构造在Matlab中不可用,其使用简单的循环,如下所示:迭代COM集合没有foreach或.Item()

for index = 1 : Collection.Count 
    item = Collection.Item(index); 
    % now do something useful with the item 
end 

这一般适用。但在我的特定集合中,.Item()只接受一个字符串(该项目的名称),而不是数字索引。所以上面的代码片段失败了,因为在迭代循环之前我不知道项目名称。

在VB中我可以做item = Collection(index),但是这在Matlab中失败了,因为Matlab理解这是“item是Collection号索引”。换句话说,Collection(2)试图访问第二个集合,而不是Collection中的第二个项目。这就是为什么我们通常在Matlab中使用.Item(index),但正如我上面所说的,这在我的特定集合中失败,其中Item只接受字符串。

所以我的问题是:我可以遍历COM集合没有foreach构造或Item(index)方法吗?

我可以告诉你如何在COM中做到这一点,但是如果Matlab可以做到这一点,我不知道。

有一个特殊的属性DISPID_NEWENUM,名称_NewEnum。检索此属性将获得一个IUnknown接口。您可以通过QueryInterface获得到IEnumVARIANT的界面。

所以简单地问一下这个接口。然后调用Next方法,并通过VARIANT从枚举中检索VARIANT,直到返回值不再是S_OK。通常在达到集合结束时返回S_FALSE。当我打电话给下一个时,我总是使用1。

因此,如果MatLab可以使用除IDispatch之外的其他接口,它应该是可能的。

+0

感谢您的回答。你介意发布一个简短的VB代码片段来实现这个吗?然后我会尝试将该VB脚本转换为Matlab –

+0

我只编程C/C++/C#。但我在MATLAB网站上找到关于使用[COM对象](https://de.mathworks.com/help/matlab/using-com-objects-in-matlab.html)的文档... – xMRi

+0

不幸的是,IEnumVariant不是在Matlab中支持,所以这看起来像一个死胡同 –