• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            關(guān)于RegisterClass的注冊位置

            Posted on 2010-05-28 14:40 S.l.e!ep.¢% 閱讀(988) 評論(0)  編輯 收藏 引用 所屬分類: VC

            ?昨天在smth,有人問起RegisterClass函數(shù)到底將窗口類注冊到哪里了,想了一下,應(yīng)該是一個(gè)系統(tǒng)級的存儲(chǔ)空間里,但是卻沒有一個(gè)明確的說法,msdn上看了半天,基本上沒有提到具體注冊的位置。倒是返回值給了不少提示,ATOM,查ATOM終于找到如下的一段描述

            ?The system provides a number of atom tables. Each atom table serves a different purpose. For example, dynamic data exchange (DDE) applications use the global atom table to share item-name and topic-name strings with other applications. Rather than passing actual strings, a DDE application passes global atoms to its partner application. The partner uses the atoms to obtain the strings from the atom table.

            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.


            也就是說應(yīng)該在一個(gè)原子表中,于是google之,終于找到一片像樣的文章。轉(zhuǎn)貼如下:

            What's the atom returned by RegisterClass useful for?

            The RegisterClass and RegisterClassEx functions return an ATOM. What is that ATOM good for?

            The names of all registered window classes is kept in an atom table internal to USER32. The value returned by the class registration functions is that atom. You can also retrieve the atom for a window class by asking a window of that class for its class atom via GetClassWord(hwnd, GCW_ATOM).

            The atom can be converted to an integer atom via the MAKEINTATOM macro, which then can be used by functions that accept class names in the form of strings or atoms. The most common case is the lpClassName parameter to the CreateWindow macro and the CreateWindowEx function. Less commonly, you can also use it as the lpClassName parameter for the GetClassInfo and GetClassInfoEx functions. (Though why you would do this I can't figure out. In order to have the atom to pass to GetClassInfo in the first place, you must have registered the class (since that's what returns the atom), in which case why are you asking for information about a class that you registered?)

            To convert a class name to a class atom, you can create a dummy window of that class and then do the aforementioned GetClassWord(hwnd, GCW_ATOM). Or you can take advantage of the fact that the return value from the GetClassInfoEx function is the atom for the class, cast to a BOOL. This lets you do the conversion without having to create a dummy window. (Beware, however, that GetClassInfoEx's return value is not the atom on Windows 95-derived operating systems.)

            But what good is the atom?

            Not much, really. Sure, it saves you from having to pass a string to functions like CreateWindow, but all it did was replace a string with with an integer you now have to save in a global variable for later use. What used to be a string that you could hard-code is now an atom that you have to keep track of. Unclear that you actually won anything there.

            I guess you could use it to check quickly whether a window belongs to a particular class. You get the atom for that class (via GetClassInfo, say) and then get the atom for the window and compare them. But you can't cache the class atom since the class might get unregistered and then re-registered (which will give it a new atom number). And you can't prefetch the class atom since the class may not yet be registered at the point you prefetch it. (And as noted above, you can't cache the prefetched value anyway.) So this case is pretty much a non-starter anyway; you may as well use the GetClassName function and compare the resulting class name against the class you're looking for.

            In other words, window class atoms are an anachronism. Like replacement dialog box classes, it's one of those generalities of the Win32 API that never really got off the ground, but which must be carried forward for backwards compatibility.

            But at least now you know what they are.

            最終的結(jié)論,RegisterClass應(yīng)該是將窗口類的數(shù)據(jù)放在User32.dll維護(hù)的一個(gè)原子表中了:)

            ?

            本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/Hamxj/archive/2007/05/09/1601758.aspx

            99久久国产综合精品成人影院| 精品久久久久久久久久中文字幕| 中文成人无码精品久久久不卡| 尹人香蕉久久99天天拍| 久久国产亚洲精品无码| 国产精品九九久久免费视频 | 久久综合偷偷噜噜噜色| 亚洲综合熟女久久久30p| 伊人色综合久久天天| 亚洲国产精品无码久久久秋霞2| 99久久无码一区人妻a黑| 日韩va亚洲va欧美va久久| 久久人人爽人人爽人人AV | 伊人久久大香线蕉亚洲| 国产精品免费久久久久影院| 中文字幕无码精品亚洲资源网久久| 久久精品成人免费网站| 亚洲AV无码1区2区久久| 伊人精品久久久久7777| 久久国产免费直播| 成人久久精品一区二区三区| 久久久无码精品亚洲日韩蜜臀浪潮| 国产精品久久久福利| 久久国产精品一国产精品金尊| 久久亚洲国产成人影院| 久久久久九国产精品| 久久久久亚洲爆乳少妇无| 亚洲国产精品久久久久婷婷软件 | 久久狠狠高潮亚洲精品| 亚洲国产精品高清久久久| 香蕉久久久久久狠狠色| 国产精品久久久久a影院| 亚洲综合久久久| 四虎国产精品成人免费久久| 亚洲综合久久夜AV | 欧美亚洲国产精品久久久久| 欧美久久一区二区三区| 亚洲国产精品狼友中文久久久| 一本色道久久88综合日韩精品 | 国产精品99久久精品爆乳| 精品久久久久久无码中文野结衣|