• <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>
            隨筆-60  評論-262  文章-1  trackbacks-0
            用 VC6 和 VC71 裝載的 ATL 開發軟件的人都知道, 當我們定義了一個自銷毀窗口時, 一般在 ATL 窗口類的

            virtual void OnFinalMessage(HWND ){...}

            函數內加一句

            delete this;

            然后就返回了. 但是氣人的是, 每次當我們返回后, 總有一個地方斷言失敗,

            ATLASSERT(pThis->m_pCurrentMsg == &msg);

            Google 了許久, 沒有滿意的解決方案, 包括微軟的方案

            http://support.microsoft.com/kb/202110

            也不好, 自己想盡辦法還是 "山重水復疑無路", 后來突然靈光突現, 徹底解決, 就一個函數調用而已: IsWindow(...). 現在, 終極解決方案是這樣的:
            搜索 atlwin.h 文件內的 "ATLASSERT(pThis->m_pCurrentMsg == &msg);" 字符串 (在文件內有 3 處), 將其原始內容
                LRESULT lRes;
                BOOL bRet 
            = pThis->ProcessWindowMessage(pThis->m_hWnd, uMsg, wParam, lParam, lRes, 0);
                
            // restore saved value for the current message
                ATLASSERT(pThis->m_pCurrentMsg == &msg);
                pThis
            ->m_pCurrentMsg = pOldMsg;
            改成
                LRESULT lRes;
                BOOL bRet 
            = pThis->ProcessWindowMessage(pThis->m_hWnd, uMsg, wParam, lParam, lRes, 0);
                
            if(FALSE == ::IsWindow(pThis->m_hWnd)) {
                    return
             lRes; // 在 CDialogImplBaseT 類里是 return FALSE;  特此說明
                }
                
            // restore saved value for the current message
                ATLASSERT(pThis->m_pCurrentMsg == &msg);
                pThis
            ->m_pCurrentMsg = pOldMsg;
            其中紅色的代碼為我們的修正代碼. 萬事大吉. 再也不會出現斷言失敗了.

            道理是這樣的: 如果 pThis 對象被刪除了的話, 那么 pThis 本身和其成員變量 m_hWnd 都將是一個無效值, 那么后續的操作將毫無意義. 因此直接返回, 不用廢話.

            真是簡單的思路直指問題的核心啊.

            posted on 2008-07-02 15:44 free2000fly 閱讀(2314) 評論(4)  編輯 收藏 引用

            評論:
            # re: 將 ATL 的一個頑固 Bug 修正了 2008-09-12 21:40 |
            錯!

            不要更改消息泵, 加一個窗口判斷是極其愚蠢的,代價是極其昂貴的。

            不能這么干,再說了 如果之前 delete this, pThis 就是一個非法指針  回復  更多評論
              
            # re: 將 ATL 的一個頑固 Bug 修正了 2008-09-14 09:17 | free2000fly
            @錯
            提出更合理的解決方案來! 僅僅對非法指針進行讀取而不做其他操作是安全的, 我懷疑你有沒有真正看明白我在說什么.
            總有人自以為是, 好為人師, 虎頭蛇尾, 應對乏術, 你呀該干嘛干嘛去.   回復  更多評論
              
            # re: 將 ATL 的一個頑固 Bug 修正了 2010-10-13 12:21 | iid
            # re: 將 ATL 的一個頑固 Bug 修正了[未登錄] 2012-09-12 12:34 | kk
            哈哈,這SB文章別誤導別人了。。。  回復  更多評論
              
            99久久人妻无码精品系列| 久久国产三级无码一区二区| 久久精品国产2020| 久久国产精品无码HDAV| 99久久婷婷国产综合亚洲| 日韩电影久久久被窝网| 狼狼综合久久久久综合网| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 色欲综合久久躁天天躁蜜桃| 国产一级做a爰片久久毛片| 天天影视色香欲综合久久| 久久亚洲AV成人无码电影| 亚洲日本久久久午夜精品| 久久精品无码一区二区三区| 久久久久久伊人高潮影院| 久久精品无码一区二区日韩AV| 久久久久久午夜成人影院| 久久综合色之久久综合| 久久免费视频网站| 亚洲AV乱码久久精品蜜桃| 精品久久久久久无码人妻热| 久久精品国产亚洲AV香蕉| 亚洲午夜无码AV毛片久久| 久久久久人妻精品一区三寸蜜桃 | 久久99热这里只频精品6| 国产激情久久久久影院| 99麻豆久久久国产精品免费| 热re99久久6国产精品免费| 久久免费看黄a级毛片| 伊人色综合九久久天天蜜桃| 久久精品国产精品亜洲毛片| 嫩草影院久久99| 久久综合综合久久狠狠狠97色88| 国产亚洲精品美女久久久| 亚洲成色www久久网站夜月| 亚洲国产欧美国产综合久久| 亚洲国产精品无码久久久秋霞2| 欧美日韩精品久久免费| 久久狠狠爱亚洲综合影院| 热久久最新网站获取| 精品久久人人爽天天玩人人妻|