c++ - FindAtom 和 MAKEINTATOM 没用?

标签 c++ winapi

据我了解,如果未找到所请求的 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/

相关文章:

c++ - 使用 Opengl 在 Window 上显示菜单

C++ 多维排序

c++ - 如何在带有初始值设定项的构造函数中使用 vprintf/cstdarg 功能?

c++ - 非阻塞套接字上的 select()、recv() 和 EWOULDBLOCK

C (WinAPI) - 获取互联网文件的大小

c++ - 如何使用Visual Studio 2019定位Windows 7?

c# - 您发现哪些工具(免费或其他)对开发和调试C#/C++有用?

c++ - vector<vector<double>> 是制作矩阵类的好方法吗?

c# - 使用 C# WPF 组件扩展 C++ Win32 应用程序

c++ - 如何使用 C++ winapi 32 默认显示组合框的第二个值?