2

我需要遍历从Windows::ApplicationModel::Store::LicenseInformation. 它应该适用于标准for_each,但我不能使用 C++/CX,只能使用 WRL。

我现在所拥有的只是ComPtr<IMapView<HSTRING, ProductLicense*>> productLicences;如何将productLicences的内容添加到某些标准集合中?

谢谢

4

1 回答 1

3

我只是在不同的 MS 平台上遇到了同样的问题,并遇到了这个悬而未决的问题。可能为时已晚,但这就是我解决它的方法。关键是IMapView继承自IIterable,所以需要获取IIterable接口(使用QueryInterface)并获取一个Iterator。以下代码是从我的平台改编为您的,因此它可能不是 100% 正确,但它提供了使用 WRL 进行迭代的关键元素。

首先,获取 IIterable 接口和一个有效的 Iterator。

ComPtr<IMapView<IKeyValuePair<HSTRING,ProductLicense*>> map;
THROW_IF_FAILED(licenseInfo->get_ProductLicenses(&map));
unsigned int mapSize = 0;
THROW_IF_FAILED(map->get_Size(&mapSize));
wprintf(L"map size %i\n", mapSize);
ComPtr<IIterable<IKeyValuePair<HSTRING,ProductLicense*>*>> iterable;
panelMap.As(&iterable);
ComPtr<IIterator<IKeyValuePair<HSTRING,ProductLicense*>*>> iterator;

现在您拥有进行迭代所需的所有信息。将迭代器设置为 Map 的第一个元素并开始迭代。下面的代码说明了迭代过程。

THROW_IF_FAILED(iterable->First(&iterator));
boolean hasCurrent = false;
THROW_IF_FAILED(iterator->get_HasCurrent(&hasCurrent));

while(hasCurrent)
{
    ComPtr<IKeyValuePair<HSTRING,ProductLicense*>> pair;
    THROW_IF_FAILED(iterator->get_Current(&pair));
    HString key;
    THROW_IF_FAILED(pair->get_Key(&key));
    ComPtr<IProductLicense> license;
    THROW_IF_FAILED(pair->get_Value(&license));
    THROW_IF_FAILED(iterator->MoveNext(&hasCurrent));
}

这在大多数支持 WRL 的 windows 平台上应该可以正常工作,只需对某些方法进行少量扩缩(例如,在我的平台中 iterator->Current(..) 的名称略有不同)。

于 2014-02-28T17:25:17.060 回答