我正在使用Windows中的API,基本上使用UINT_PTR(对象的地址)进行回调,并提供获取有关这些对象的更多信息的方法。C++:在unordered_map中查找已修改的UINT_PTR <UINT_PTR,Object *>
我有一个集合,其中MyObject来是我的课持有我所关心的信息(并不重要,对这个问题):
std::unordered_map<UINT_PTR,MyObject*> objectMap;
而且我有一个将被多次调用功能。在某些情况下,API提供的地址需要修改。我无法在我的收藏中找到任何修改的UINT_PTR。例如:
void CallbackHandler::APICallback(UINT_PTR address)
{
UINT_PTR collectionKey = address;
if(SomeCondition())
{
collectionKey -= 0x10;
}
if(objectMap.count(collectionKey) == 1)
{
// Write message to log, condition we care about occurred
}
else
{
// Do some info gathering and evaluation, possibly adding collectionKey to objectMap
}
}
因此,例如,在第一时间将上述功能被称为“0xFF4116A8”添加到收藏。第二次调用该函数时,地址=“0xFF4116B8”,SomeCondition()恰好为真,因此我们再减去0x10以获得“0xFF4116A8”。然而,objectMap.count(“0xFF4116A8”)== 1是不正确的...但是当我记录集合“0xFF4116A8”的内容确实在那里。
我怀疑我在尝试在UINT_PTR上进行算术运算或对unordered_map的行为做出一些错误的假设时犯了某种根本性的错误。我在这里做了什么错误,以及修改UINT_PTR然后在集合中查找它的正确方法是什么?
如果从。减去0x10的一个UINT-PTR您ADRESS将0x40的递减而不是0x10的 – 2013-05-07 13:26:24
我有一个问题:为什么不安排事情,所以在uintptr_t的点为myObject实例,而不是额外的层间接提供的地图? – 2013-05-07 13:45:12
@vlad_tepesch请注意,尽管名称不同,UINT_PTR是一种Windows类型,定义为unsigned __int64,而不是UINT *。所以算术是正确的 – 2013-05-07 14:40:55