私は基本的に UINT_PTR (オブジェクトのアドレス) でコールバックし、これらのオブジェクトに関する詳細情報を取得するメソッドを提供する Windows の API を使用しています。
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」がコレクションに追加されます。関数が 2 回目に呼び出されると、address="0xFF4116B8" と SomeCondition() がたまたま true になるため、0x10 を引いて "0xFF4116A8" を再度取得します。ただし、 objectMap.count("0xFF4116A8")==1 は正しくありません...しかし、コレクションの内容をログに記録すると、「0xFF4116A8」が実際にあります。
UINT_PTR で算術演算をしようとしたり、unordered_map の動作について間違った想定をしたりして、ある種の根本的な間違いを犯していると思われます。私はここでどのような間違いを犯しており、UINT_PTR を変更してコレクションで検索する適切な方法は何ですか?