シグニチャー
ATOM WINAPI FindAtom(
__in LPCTSTR lpString
);
Iワイン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)))
MAKEINTATOM(12345)
は、整数アトムを文字列ポインタにキャストして返します。
- あなたは整数原子を表す引数で呼び出されたときに、この機能はUINTへのポインタを返します見ることができるように条件
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 }
をチェックFindAtom(MAKEINTATOM(12345))
を呼び出します。 その後、それはあなたがcout << FindAtom (MAKEINTATOM (12345));
呼び出すときですから、出力として12345を取得
return iatom;
ボディを実行します。
私は理解していないと思います:(これは、Integersを持つFindAtomが本当に役に立たないのでしょうか? – muxmux