2011-07-09 10 views
3

私が理解しているように、FindAtomは要求されたAtomが見つからないと0を返します。しかし、この小さなコードでも、AddAtomがまったくなくても、常に何かを返すようです。何故ですか?これはFindAtomをIntsが役に立たないようにしないのですか? :confus:FindAtom関数のMAKEINTATOMでFindAtomは役に立ちませんか?

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

バイ

答えて

2

シグニチャー

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))) 
  1. MAKEINTATOM(12345)は、整数アトムを文字列ポインタにキャストして返します。
  2. あなたは整数原子を表す引数で呼び出されたときに、この機能は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; 
    

    ボディを実行します。

  • +0

    私は理解していないと思います:(これは、Integersを持つFindAtomが本当に役に立たないのでしょうか? – muxmux

    関連する問題