About Atom Tables
来源:互联网 发布:领英试用高级账号 知乎 编辑:程序博客网 时间:2024/05/20 07:59
Applications can use local atom tables to store their own item-name associations.
The system uses atom tables that are not directly accessible to applications. However, the application uses these atoms when calling a variety of functions. For example, registered clipboard formats are stored in an internal atom table used by the system. An application adds atoms to this atom table using the RegisterClipboardFormat function. Also, registered classes are stored in an internal atom table used by the system. An application adds atoms to this atom table using the RegisterClass or RegisterClassEx function.
The following topics are discussed in this section.
- Global Atom Table
- Local Atom Tables
- Atom Types
- Atom Creation and Usage Count
- Atom-Table Queries
- Atom String Formats
Global Atom Table
The global atom table is available to all applications. When an application places a string in the global atom table, the system generates an atom that is unique throughout the system. Any application that has the atom can obtain the string it identifies by querying the global atom table.
An application that defines a private DDE-data format for sharing data with other applications should place the format name in the global atom table. This technique prevents conflicts with the names of formats defined by the system or by other applications, and makes the identifiers (atoms) for the messages or formats available to the other applications.
Local Atom Tables
An application can use a local atom table to efficiently manage a large number of strings used only within the application. These strings, and the associated atoms, are available only to the application that created the table.
An application requiring the same string in a number of structures can reduce memory usage by using a local atom table. Rather than copying the string into each structure, the application can place the string in the atom table and include the resulting atom in the structures. In this way, a string appears only once in memory but can be used many times in the application.
Applications can also use local atom tables to save time when searching for a particular string. To perform a search, an application need only place the search string in the atom table and compare the resulting atom with the atoms in the relevant structures. Comparing atoms is typically faster than comparing strings.
Atom tables are implemented as hash tables. By default, a local atom table uses 37 buckets for its hash table. However, you can change the number of buckets used by calling the InitAtomTable function. If the application calls InitAtomTable, however, it must do so before calling any other atom-management functions.
Atom Types
Applications can create two types of atoms: string atoms and integer atoms. The values of integer atoms and string atoms do not overlap, so both types of atoms can be used in the same block of code.
Several functions accept either strings or atoms as parameters. When passing an atom to these functions, an application can use the MAKEINTATOM macro to convert the atom into a form that can be used by the function.
The following sections describe atom types.
String Atoms
When applications pass null-terminated strings to the GlobalAddAtom, AddAtom, GlobalFindAtom, and FindAtom functions, they receive string atoms (16-bit integers) in return. String atoms have the following properties:
- The values of string atoms are in the range 0xC000 (MAXINTATOM) through 0xFFFF.
- Case is not significant in searches for an atom name in an atom table. Also, the entire string must match in a search operation; no substring matching is performed.
- The string associated with a string atom can be no more than 255 bytes in size. This limitation applies to all atom functions.
- A reference count is associated with each atom name. The count is incremented each time the atom name is added to the table and decremented each time the atom name is deleted from it. This prevents different users of the same string atom from destroying each other's atom names. When the reference count for an atom name equals zero, the system removes the atom and the atom name from the table.
Integer Atoms
Integer atoms differ from string atoms in the following ways:
- The values of integer atoms are in the range 0x0001 through 0xBFFF (MAXINTATOM – 1).
- The string representation of an integer atom is #dddd, where the values represented by dddd are decimal digits. Leading zeros are ignored.
- There is no reference count or storage overhead associated with an integer atom.
Atom Creation and Usage Count
An application creates a local atom by calling the AddAtom function; it creates a global atom by calling the GlobalAddAtom function. Both functions require a pointer to a string. The system searches the appropriate atom table for the string and returns the corresponding atom to the application. In the case of a string atom, if the string already resides in the atom table, the system increments the reference count for the string during this process.
Repeated calls to add the same atom name return the same atom. If the atom name does not exist in the table when AddAtom is called, the atom name is added to the table and a new atom is returned. If it is a string atom, its reference count is also set to one.
An application should call the DeleteAtom function when it no longer needs to use a local atom; it should call the GlobalDeleteAtom function when it no longer needs a global atom. In the case of a string atom, either of these functions reduces the reference count of the corresponding atom by one. When the reference count reaches zero, the system deletes the atom name from the table.
The atom name of a string atom remains in the global atom table as long as its reference count is greater than zero, even after the application that placed it in the table terminates. A local atom table is destroyed when the associated application terminates, regardless of the reference counts of the atoms in the table.
Atom-Table Queries
An application can determine whether a particular string is already in an atom table by using the FindAtom or GlobalFindAtom function. These functions search an atom table for the specified string and, if the string is there, return the corresponding atom.
An application can use the GetAtomName or GlobalGetAtomName function to retrieve an atom-name string from an atom table, provided the application has the atom corresponding to the string being sought. Both functions copy the atom-name string of the specified atom to a buffer and return the length of the string that was copied. GetAtomName retrieves an atom-name string from a local atom table, and GlobalGetAtomName retrieves an atom-name string from the global atom table.
Atom String Formats
The AddAtom, GlobalAddAtom, FindAtom, and GlobalFindAtom functions take a pointer to a null-terminated string. An application can specify this pointer in one of the following ways.
#dddd | An integer specified as a decimal string. Used to create or find an integer atom. |
string atom name | A string atom name. Used to add a string atom name to an atom table and receive an atom in return. |
- About Atom Tables
- TABLES ABOUT CRM MARTETING
- Five Myths about Hash Tables
- About Compress Tables and structure
- Atom
- Atom
- atom
- atom
- ATOM
- Atom
- atom
- MM--A List of Tables and Tcodes about MM
- MM--A List of Tables and Tcodes about MM
- 视图中的难点:主键表 About Key-Preserved Tables
- Which three statements are correct about temporary tables? (Choose three.) A. Indexes and views can
- 177.Which three statements are correct about temporary tables? (Choose three.)
- about:
- about
- NetBeans下用于Open Calais的SOAP客户机(一)
- MySQL沿用旧版GPL
- DirectShow之接口实战篇(三)
- GDI+带农历的万年历(周历)之制作
- 存储过程和.Net中使用事务的实例
- About Atom Tables
- 如何用触发器管理MySQL数据库
- 在Delphi中进行指纹仪的二次开发
- 不能访问WindowsInstaller服务的解决方法
- FC 6 + ACE5.6编译过程
- 核对表:前期准备
- 呀啊呀
- 如何安全的远程使用MySQL GUI工具
- Delphi面向对象编程的20条规则(By Marco Cantu)(rule