友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

深入浅出MFC第2版(PDF格式)-第168部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!


            return TRUE; 

          } 



      也在  OLE server  這麼做: 



          #include 〃tracewin。h〃 

          。。。 

          BOOL CScribbleApp::InitInstance() 

          { 

            。。。 

            pMainFrame…》ShowWindow(m_nCmdShow); 

            pMainFrame…》UpdateWindow(); 



            CMfxTrace::Init(); 

            return TRUE; 

          } 



      然後我就可以使用  TRACE  巨集並搭配  Tracewin  看個過癮了。 



                                                                                         933 


…………………………………………………………Page 996……………………………………………………………

                   第五篇    附錄  



                   很好,當這兩個程式獨立執行的時候,切盡如意!但是當我在  container  即編輯 



                   Scribble item               Scribble TRACE             Tracewin  

                              ,我發現洠в腥魏巍                      ∽执伙@示在               視窗。這麼 



                   來我就觀察不到  Scribble  的交叉作用了呀!於是我想,莫不是兩個程式爭用  afxDump ? 



                   或是因為兩個  Win32  行程使用不同的位址空間?或是因為。。。 



                   胡說!洠У览硌健H绻医徊媸褂酶髯元毩⒌摹 ontainer  和  Scribble(不牽扯即編輯), 



                   它們的  TRACE  結果會交叉出現在  Tracewin  視窗,這就推翻了述的胡思亂想。 



                   然後我想,會不會是即編輯時根本洠в羞M入   server                           的   InitInstance ?如果 



                   CMfxTrace  Init             TRACE 

                            ::    洠в邢葓绦羞^,              當然就不會輸出到  Tracewin  視窗囉。於是我把 



                   CMfxTrace  Init 

                            ::         。。。 。。。                      server                 server 

                                 改設在 唔 什麼方才是即編輯時                       的第個必經之? 



                   item  是也。於是我這麼做: 



                       CScribbleItem::CScribbleItem(CScribbleDoc* pContainerDoc) 

                              : COleServerItem(pContainerDoc; TRUE) 

                       { 

                              CMfxTrace::Init(); 



                              // TODO: add one…time construction code here 

                              //  (eg; adding additional clipboard formats 

                              //   to the item's data source) 

                       } 



                                             圖八    Tracewin  

                   賓果!我看到了預期的枺鳌! 【褪恰                         ∫暣爱嬅妗_@些輸出結果幫助我分析出 



                   OLE container  和  server  的舉動。 



934 


…………………………………………………………Page 997……………………………………………………………

                                           附錄D    以MFC 重建DBWIN  



      圖八   Tracewin   視窗畫面 



  新的視野 



   好的除錯工具,不應該要求應用程式碼本身做任何配合性的動作。Paul  DiLascia  的 



   Tracewin  小工具是個權宜之計。使用稱不太方便(你得含入個  tracewin。h ), 



   而且你得有某種程度的技術背景才能把它用得好。不過,說真的,我還是很感謝  Paul 



   DiLascia  的創意,讓我們的視野有了新的角度。 



   我想你也是。 



                                                                  935 


…………………………………………………………Page 998……………………………………………………………

                第五篇    附錄  



           重建 DBWIN 之 Debug Event 篇 



                                DBWIN                             DBWIN  

                 自從我開始注意到             之後,我就更加注意期刊有關於                  技巧的文章。這 



                才發現,好像大家滿喜歡在這個睿空宫F自己傲的功力。像  Paul Dilascia  這樣,以 



                        MFC     DBWIN                         …      MFC programming 

                高階的        來寫         ,當然也就不可能太過「威力」 雖然從 



                                              Paul                                 。h 

                的技巧來看,我們是學了不少。你知道,                的方法要求你改變你的原始碼,含入個 



                檔,並在你的  。cpp  檔加兩行。這在使用的方便性不怎麼高明。 



                要高明點,不落痕跡抓到  TRACE  輸出,就必須懂得  Windows  作業系統內部,以 



                     Windows   system   programming              Matt   Pietrek  

                及                          。是的,這方面的大師                     也寫了個 



                DBWIN                                debug event 

                       ,不必影響你的原始碼。不過,他用到                     ,以及許多系統知識,不應該 



                是本  MFC  書籍適合涵蓋的主睿K裕抑荒茉谶@裡告訴你,可以到  Microsoft 



                Systems  Journal  1995。07  的  Windows  Q/A  專欄學習。程式名稱為  LODPRF32  。此程 



                式的主要功能其實是讓你觀察目前所有映射到記憶體的  DLLs  。你可以從知道你的 



                EXE                     DLLs                    implicitly loading EXE 

                     直接或間接使用的所有            。它還會記錄「最後次                     」至「 



                entry  point  執行」之間的經過時間。此期間正是  Win32  載入器呼叫  implicitly  loaded 



                DLLs  的初始化程式碼(程式進入點)的時間。最後,它允許使用者濾掉所有的  debug 



                event                OutputDebugString        …            DBWIN !? 

                     ,只記錄被除錯端的                     輸出的字串  這功能可不正是 



                使用真簡單,不是嗎!這程式若說還有什麼缺點,那就是「只有被此  DBWIN  載入之程 



                式,其  TRACE  輸出字串才能夠被觀察」。有洠в锌赡芟瘛 in16  的  DBWIN  那樣,做 



                個系統層面的  〃global〃  DBWIN  ,像常駐程式那樣隨時偵測等候任何程式發出的任何 



                TRACE  字串呢?可能,但我們還要再層獄,進入  ring0  層次。 



936 


…………………………………………………………Page 999……………………………………………………………

                                                                  附錄D    以MFC 重建DBWIN  



                                             CreateProcess(。。。DEBUG_ONLY_THIS_PROCESS。。。); 



                                                                                    process A 



                                                                                 。。。 

                                                                                 TRACE(〃trace1 n〃); 

                                                                                 TRACE(〃trace2 n〃); 

                                                                                 TRACE(〃trace3 n〃); 

                                                                                 。。。 



                                                            OUTPUT_DEBUG_STRING_EVENT 



          LODPRF32 功能不少。若你把 〃OutputDebugString Only〃 

          那個圓鈕按,它就是個 DBWIN 。 



       圖九      LODPRF32   功能不少。若你把   〃OutputDebugString Only〃   那個圓 

              鈕按下,它就是個   DBWIN  。 



重建 DBWIN 之VxD 篇 



                      global DBWIN                                                  Ton Plooy 

       若想要寫個                       ,困難度陡增。不過,已經有做出來了。請參考 



       發表於   Windows Developer's Journal 1996。12  的  〃A DBWIN Utility for Win95〃  文。 



       前個  DBWIN  之所以不能夠做到  〃global〃  ,是因為行程有獨立的位址空間。如欲接收 



       除錯訊息,又必須建立「除錯器」與「被除錯端」的關係。那麼,有洠в惺颤N辦法 



       可以建立個「系統除錯器」,把所有執行起來的程式統統視為我的除錯對象?如果這 



       個問睿锌隙ù鸢福琯lobal DBWIN  就有希望了。 



       有,VMM  提供了個  INT 41h  介面。此介面作用起來的條件是,必須有個「系統除 



       錯器」存在。而「系統除錯器」存在的條件是:當  VMM  以int41h/AX=DS_DebLoaded  發 



       出訊息時,必須有程式以  AX=DS_DebPresent  回覆之。 



       可是  OutputDebugString  和「系統除錯器」有洠в惺颤N牽連?如果洠в袆t切白搭。幸 



       叩氖恰 utputDebugString  最終會牽動  VMM  的  Exec_PM_Int41h  service 。如果我們能 



                                                                                                    937 


…………………………………………………………Page 1000……………………………………………………………

                         第五篇    附錄  



                                                 Exec_PM_Int41h                                 Exec  PM  Int41h 

                                                                             hooking                 _    _          

                         夠寫個程式,與                                    掛勾(               ),使                          能夠先來呼 



                          叫我自己的函式,我就可以悠游自在在其處理TRACE  的除錯字串了。 



                         這個技術最大的難點在於,要與  VMM  打交道,我們得寫  ring0  程式。在  Windows 95   



                                            VxD    NT             VxD      VxD                            DOS/Windows  虛虛 

                         這意味著要寫                  ( 不支援                 )。        的架構其實不太難,                                     虛虛 



                         擬機器作業環境擬機器作業環境                   /         1993                                             VMM  

                         擬機器作業環境擬機器作業環境 (侯俊傑 旗標,                          )曾經有過詳細的探討。問睿陟丁                                  〉脑S 



                          多  services  常常要合著用,尤其是面對斷模擬、事件處理、與  ring3  通訊過程、乃至 



                         於  hooking  的處理等等,而這方面的資料與範例相當稀少。此外,ring0  和  ring3  間的 



                          同步(synchronous )處理,也很令頭痛。 



                                                                                                                            process A 

                                                           global  DBWIN 

                                                                                                                     。。。 

                                                                                                                     TRACE(〃JJHOU n〃); 

                                                                                                                     TRACE(〃MikeSon n〃); 

                                                                                                                     TRACE(〃Matt n〃); 

                                                                                                                     。。。 



                                                                                                                              process B 



                                                                                                                     。。。 

                                                                                                                     TRACE(〃trace1 n〃); 

            
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!