• <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  評(píng)論-262  文章-1  trackbacks-0
            用 VC6 和 VC71 裝載的 ATL 開(kāi)發(fā)軟件的人都知道, 當(dāng)我們定義了一個(gè)自銷(xiāo)毀窗口時(shí), 一般在 ATL 窗口類(lèi)的

            virtual void OnFinalMessage(HWND ){...}

            函數(shù)內(nèi)加一句

            delete this;

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

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

            Google 了許久, 沒(méi)有滿(mǎn)意的解決方案, 包括微軟的方案

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

            也不好, 自己想盡辦法還是 "山重水復(fù)疑無(wú)路", 后來(lái)突然靈光突現(xiàn), 徹底解決, 就一個(gè)函數(shù)調(diào)用而已: IsWindow(...). 現(xiàn)在, 終極解決方案是這樣的:
            搜索 atlwin.h 文件內(nèi)的 "ATLASSERT(pThis->m_pCurrentMsg == &msg);" 字符串 (在文件內(nèi)有 3 處), 將其原始內(nèi)容
                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 類(lèi)里是 return FALSE;  特此說(shuō)明
                }
                
            // restore saved value for the current message
                ATLASSERT(pThis->m_pCurrentMsg == &msg);
                pThis
            ->m_pCurrentMsg = pOldMsg;
            其中紅色的代碼為我們的修正代碼. 萬(wàn)事大吉. 再也不會(huì)出現(xiàn)斷言失敗了.

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

            真是簡(jiǎn)單的思路直指問(wèn)題的核心啊.

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

            評(píng)論:
            # re: 將 ATL 的一個(gè)頑固 Bug 修正了 2008-09-12 21:40 | 錯(cuò)
            錯(cuò)!

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

            不能這么干,再說(shuō)了 如果之前 delete this, pThis 就是一個(gè)非法指針  回復(fù)  更多評(píng)論
              
            # re: 將 ATL 的一個(gè)頑固 Bug 修正了 2008-09-14 09:17 | free2000fly
            @錯(cuò)
            提出更合理的解決方案來(lái)! 僅僅對(duì)非法指針進(jìn)行讀取而不做其他操作是安全的, 我懷疑你有沒(méi)有真正看明白我在說(shuō)什么.
            總有人自以為是, 好為人師, 虎頭蛇尾, 應(yīng)對(duì)乏術(shù), 你呀該干嘛干嘛去.   回復(fù)  更多評(píng)論
              
            # re: 將 ATL 的一個(gè)頑固 Bug 修正了 2010-10-13 12:21 | iid
            # re: 將 ATL 的一個(gè)頑固 Bug 修正了[未登錄](méi) 2012-09-12 12:34 | kk
            哈哈,這SB文章別誤導(dǎo)別人了。。。  回復(fù)  更多評(píng)論
              

            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            免费一级做a爰片久久毛片潮| 91精品观看91久久久久久| 久久人人爽人人爽人人片AV高清| 亚洲精品高清一二区久久| 亚洲综合伊人久久大杳蕉| www.久久热.com| 午夜精品久久影院蜜桃| 国产精品对白刺激久久久| 青春久久| 国产成人久久激情91| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久一区二区三区免费| 7777久久久国产精品消防器材| 精品一区二区久久| 九九精品久久久久久噜噜| 国产69精品久久久久99| 性高湖久久久久久久久| 人妻系列无码专区久久五月天| 狠狠色丁香久久婷婷综合五月| 伊人久久大香线蕉无码麻豆| 久久久青草久久久青草| 色综合久久中文字幕无码| 亚洲国产成人乱码精品女人久久久不卡 | 丁香五月网久久综合| 精品熟女少妇AV免费久久| 久久精品国产精品亚洲| 久久国产乱子精品免费女| 久久亚洲精品中文字幕| 无码人妻少妇久久中文字幕蜜桃| 亚洲国产精品成人久久蜜臀| 久久久中文字幕日本| 国产无套内射久久久国产| 国产成人精品久久| 久久99精品国产麻豆蜜芽| 中文字幕成人精品久久不卡| 亚洲午夜福利精品久久| 久久99精品久久久久久齐齐| 久久91精品国产91久久麻豆| 亚洲午夜久久久久久噜噜噜| 亚洲国产日韩综合久久精品| 国产精品成人无码久久久久久 |