首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WRL在IMapView上迭代

使用WRL在IMapView上迭代
EN

Stack Overflow用户
提问于 2013-08-20 09:47:29
回答 1查看 1.4K关注 0票数 2

我需要迭代从IMapView获得的Windows::ApplicationModel::Store::LicenseInformation。它应该与标准的for_each一起工作,bud不能使用C++/CX,只能使用WRL。

我现在只有ComPtr<IMapView<HSTRING, ProductLicense*>> productLicences;,如何才能将productLicences的内容放到一些标准的集合中呢?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-28 17:25:17

我只是在一个不同的MS平台上遇到了同样的问题,并且遇到了这个没有答案的问题。也许为时已晚,但我就是这样解决的。关键是IMapView继承自IIterable,因此您需要获得IIterable接口(使用QueryInterface)并获得一个Iterator。下面的代码是从我的平台到您的平台的一个调整,所以它可能不是100%正确的,但是它提供了使用WRL进行迭代的关键元素。

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

代码语言:javascript
复制
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的第一个元素,然后开始迭代。下面的代码说明了迭代过程。

代码语言:javascript
复制
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平台上,这应该都能很好地工作,只需对某些方法进行少量扩展(例如,在我的平台迭代器->Current(.)中)有稍微不同的名字)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18331939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档