FindAtom с MAKEINTATOM бесполезен? - PullRequest
3 голосов
/ 09 июля 2011

, насколько я понимаю, FindAtom возвращает 0, если запрошенный атом не найден.Но даже в этом небольшом коде, вообще без AddAtom, кажется, что он всегда что-то возвращает.Это почему?Разве это не делает FindAtom с Ints бесполезным?: confus:

int main( ) {
  cout << FindAtom(MAKEINTATOM(12345));  // Output: 12345
  cout << FindAtom(MAKEINTATOM(2011));  // Output: 2011
  return 0;
}

Пока

1 Ответ

2 голосов
/ 09 июля 2011

Подпись функции FindAtom:

ATOM WINAPI FindAtom(
    __in  LPCTSTR lpString
);

Я нашел следующий код в Wine svn-repository . Он представляет основную логику:

295 ATOM WINAPI FindAtom16( LPCSTR str )
296 {
297     ATOMTABLE * table;
298     WORD hash,iatom;
299     HANDLE16 entry;
300     int len;
301 
302     TRACE("%s\n",debugstr_a(str));
303 
304     if (ATOM_IsIntAtomA( str, &iatom )) return iatom;
305     if ((len = strlen( str )) > 255) len = 255;
306     if (!(table = ATOM_GetTable( FALSE ))) return 0;
307     hash = ATOM_Hash( table->size, str, len );
308     entry = table->entries[hash];
309     while (entry)
310     {
311         ATOMENTRY * entryPtr = ATOM_MakePtr( entry );
312         if ((entryPtr->length == len) &&
313             (!strncasecmp( entryPtr->str, str, len )))
314         {
315             TRACE("-- found %x\n", entry);
316             return HANDLETOATOM( entry );
317         }
318         entry = entryPtr->next;
319     }
320     TRACE("-- not found\n");
321     return 0;
322 }

Итак, давайте попробуем отследить программу, когда она вызывает функцию FindAtom:

FindAtom(MAKEINTATOM(12345));

MAKEINTATOM - это макрос:

#define MAKEINTATOM(i) (LPTSTR)((DWORD)((WORD)(i)))
  1. MAKEINTATOM(12345) возвращает целочисленный атом, приведенный к строковому указателю.
  2. Звонок FindAtom(MAKEINTATOM(12345))
  3. Проверка состояния if (ATOM_IsIntAtomA( str, &iatom ))
119 static BOOL ATOM_IsIntAtomA(LPCSTR atomstr,WORD *atomid)
120 {
121     UINT atom = 0;
122     if (!HIWORD(atomstr)) atom = LOWORD(atomstr);
123     else
124     {
125         if (*atomstr++ != '#') return FALSE;
126         while (*atomstr >= '' && *atomstr <= '9')
127         {
128             atom = atom * 10 + *atomstr - '';
129             atomstr++;
130         }
131         if (*atomstr) return FALSE;
132     }
133     if (atom >= MAXINTATOM)
134     {
135         SetLastError( ERROR_INVALID_PARAMETER );
136         atom = 0;
137     }
138     *atomid = atom;
139     return TRUE;
140 }

Как видите, эта функция будет возвращать указатель на UINT при вызове с аргументом, представляющим целочисленный атом.

Затем выполняет тело

return iatom;

Поэтому, когда вы звоните cout << FindAtom (MAKEINTATOM (12345));, вы получаете 12345 в качестве вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...