gpt4 book ai didi

c++ - FindAtom 和 MAKEINTATOM 没用?

转载 作者:太空狗 更新时间:2023-10-29 21:50:11 26 4
gpt4 key购买 nike

据我了解,如果未找到所请求的 Atom,FindAtom 将返回 0。但即使在这个小代码中,根本没有任何 AddAtom,它似乎总是返回一些东西。这是为什么?这不会让带有 Ints 的 FindAtom 变得毫无用处吗? :混淆:

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

再见

最佳答案

签名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 作为输出。

关于c++ - FindAtom 和 MAKEINTATOM 没用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6631812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com