• <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>

            C++ Programmer's Cookbook

            {C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

            windows核心編程--SEH(結(jié)構(gòu)異常處理)

            主要參考:http://blog.csdn.net/hbrr224/archive/2006/05.aspx

            SEH 的工作原理。
            ???????? Windows 程序設(shè)計(jì)中最重要的理念就是消息傳遞,事件驅(qū)動(dòng)。當(dāng)GUI應(yīng)用程序觸發(fā)一個(gè)消息時(shí),系統(tǒng)將把該消息放入消息隊(duì)列,然后去查找并調(diào)用窗體的消息處理函數(shù)(CALLBACK),傳遞的參數(shù)當(dāng)然就是這個(gè)消息。我們同樣可以把異常也當(dāng)作是一種消息,應(yīng)用程序發(fā)生異常時(shí)就觸發(fā)了該消息并告知系統(tǒng)。系統(tǒng)接收后同樣會(huì)找它的“回調(diào)函數(shù)”,也就是我們的異常處理例程。當(dāng)然,如果我們?cè)诔绦蛑袥](méi)有做異常處理的話,系統(tǒng)也不會(huì)置之不理,它將彈出我們常見(jiàn)的應(yīng)用程序錯(cuò)誤框,然后結(jié)束該程序。所以,當(dāng)我們改變思維方式,以CALLBACK 的思想來(lái)看待 SEH,SEH 將不再神秘。

            SEH 是 Windows 系統(tǒng)提供的功能,跟開(kāi)發(fā)工具無(wú)關(guān)。值得一提的是,VC 將 SEH 進(jìn)行了封裝 try? catch? finally,c++中也可以用c的封裝 __try{}__except(){} 和 __try{}__finally{}. 所以當(dāng)你建立一個(gè)C++ try塊時(shí),編譯器就生成一個(gè)S E H_ _t r y塊。一個(gè)C + +c a t c h測(cè)試變成一個(gè)S E H異常過(guò)濾器,并且c a t c h中的代碼變成S E H_ _e x c e p t塊中的代碼。實(shí)際上,當(dāng)你寫(xiě)一條C++ throw語(yǔ)句時(shí),編譯器就生成一個(gè)對(duì)Wi n d o w s的R a i s e E x c e p t i o n函數(shù)的調(diào)用。用于t h r o w語(yǔ)句的變量傳遞給R a i s e E x c e p t i o n作為附加的參數(shù)。

            r_no157.gif
            一個(gè)簡(jiǎn)單的使用SEH的例子

            假如要實(shí)現(xiàn)一個(gè)完全強(qiáng)壯的應(yīng)用程序,該程序需要每周7天,每天2 4小時(shí)運(yùn)行。在今天的世界里,軟件變得這么復(fù)雜,有那么多的變量和因子來(lái)影響程序的性能,筆者認(rèn)為如果不用S E H,要實(shí)現(xiàn)完全強(qiáng)壯的應(yīng)用程序簡(jiǎn)直是不可能的。我們先來(lái)看一個(gè)樣板程序,即C的運(yùn)行時(shí)函數(shù)s t r c p y:

            char * ?strcpy(
            ???
            char * ?strDestination,
            ???
            const ? char * ?strSource);


            這是一個(gè)相當(dāng)簡(jiǎn)單的函數(shù),它怎么會(huì)引起一個(gè)進(jìn)程結(jié)束呢?如果調(diào)用者對(duì)這些參數(shù)中的某一個(gè)傳遞N U L L(或任何無(wú)效的地址),s t r c p y就引起一個(gè)存取異常,并且導(dǎo)致整個(gè)進(jìn)程結(jié)束。
            使用S E H,就可以建立一個(gè)完全強(qiáng)壯的s t r c p y函數(shù):

            char * ?RobustStrCpy( char * ?strDestination,? const ? char * ?strSource)
            {
            ???__try?
            ???
            {
            ??????strcpy(strDestination,?strSource);
            ???}

            ???__except(EXCEPTION_EXECUTE_HANDLER)
            ???
            {
            ??????
            // ?Nothing?to?do?here
            ???}


            ???
            return (strDestination);
            }



            這個(gè)函數(shù)所做的一切就是將對(duì)s t r c p y的調(diào)用置于一個(gè)結(jié)構(gòu)化的異常處理框架中。如果s t r c p y執(zhí)行成功,函數(shù)就返回。如果s t r c p y引起一個(gè)存取異常,異常過(guò)濾器返回E X C E P T I O N _E X E C U T E _ H A N D L E R,導(dǎo)致該線程執(zhí)行異常處理程序代碼。在這個(gè)函數(shù)中,處理程序代碼什么也不做,R o b u s t S t r C p y只是返回到它的調(diào)用者,根本不會(huì)造成進(jìn)程結(jié)束。

            另一個(gè)使用:

            #include? " stdio.h "

            void ?test()
            {
            int * ?p? = ? 0x00000000 ;? // ?pointer?to?NULL

            __try
            {
            puts(
            " in?try " );
            __try
            {
            puts(
            " in?try " );

            // ?causes?an?access?violation?exception;
            // ?導(dǎo)致一個(gè)存儲(chǔ)異常
            * p? = ? 13 ;?

            // ?呵呵,注意這條語(yǔ)句
            puts( " 這里不會(huì)被執(zhí)行到 " );
            }

            __finally
            {
            puts(
            " in?finally " );
            }


            // ?呵呵,注意這條語(yǔ)句
            puts( " 這里也不會(huì)被執(zhí)行到 " );
            }

            __except(puts(
            " in?filter?1 " ),? 0 )
            {
            puts(
            " in?except?1 " );
            }

            }


            void ?main()
            {
            puts(
            " hello " );
            __try
            {
            test();
            }

            __except(puts(
            " in?filter?2 " ),? 1 )
            {
            puts(
            " in?except?2 " );
            }

            puts(
            " world " );
            }

            ?

            上面的程序運(yùn)行結(jié)果如下:
            hello
            in try
            in try
            in filter 1
            in filter 2
            in finally
            in except 2
            world
            Press any key to continue

            另一個(gè)混合c++的異常處理使用:

            // 注意,這是 C++ 程序,文件名為: SEH-test.cpp

            #include? " stdio.h " ?

            class ?A?

            {?

            public :?

            void ?f1()? {} ?

            // ?拋出?C++?異常?

            void ?f2()? {? throw ? 888 ;} ?

            }
            ;?

            // ?這個(gè)函數(shù)中使用了?try-catch?處理異常,也即?C++?異常處理?

            void ?test1()?

            {?

            A?a1;?

            A?a2,a3;?

            try ?

            {?

            a2.f1();?

            a3.f2();?

            }
            ?

            catch ( int ?errorcode)?

            {?

            printf(
            " catch?exception,error?code:%d\n " ,?errorcode);?

            }
            ?

            }
            ?

            // ?這個(gè)函數(shù)沒(méi)什么改變,仍然采用?try-except?異常機(jī)制,也即?SEH?機(jī)制?

            void ?test()?

            {?

            int * ?p? = ? 0x00000000 ;? // ?pointer?to?NULL?

            __try?

            {?

            // ?這里調(diào)用?test1?函數(shù)?

            test1();?

            puts(
            " in?try " );?

            __try?

            {?

            puts(
            " in?try " );?

            // ?causes?an?access?violation?exception;?

            // ?導(dǎo)致一個(gè)存儲(chǔ)異常?

            * p? = ? 13 ;?

            puts(
            " ?這里不會(huì)被執(zhí)行到? " );?

            }
            ?

            __finally?

            {?

            puts(
            " in?finally " );?

            }
            ?

            puts(
            " ?這里也不會(huì)被執(zhí)行到? " );?

            }
            ?

            __except(puts(
            " in?filter?1 " ),? 0 )?

            {?

            puts(
            " in?except?1 " );?

            }
            ?

            }
            ?

            void ?main()?

            {?

            puts(
            " hello " );?

            __try?

            {?

            test();?

            }
            ?

            __except(puts(
            " in?filter?2 " ),? 1 )?

            {?

            puts(
            " in?except?2 " );?

            }
            ?

            puts(
            " world " );?

            }
            ?


            上面程序不僅能夠被編譯通過(guò),而且運(yùn)行結(jié)果也是正確的(和預(yù)期的一樣,同樣符合 C++ 異常處理模型的規(guī)則,和 SEH 異常模型的處理規(guī)則)。其結(jié)果如下:

            hello

            catch exception,error code:888

            in try

            in try

            in filter 1

            in filter 2

            in finally

            in except 2

            world

            Press any key to continue

            主要參考:http://blog.csdn.net/hbrr224/archive/2006/05.aspx

            posted on 2006-09-22 14:52 夢(mèng)在天涯 閱讀(23205) 評(píng)論(2)  編輯 收藏 引用 所屬分類: Windows API

            評(píng)論

            # re: windows核心編程--SEH(結(jié)構(gòu)異常處理)[未登錄](méi) 2015-12-11 20:31 d

            <script>alert("1")</script>  回復(fù)  更多評(píng)論   

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計(jì)

            • 隨筆 - 461
            • 文章 - 4
            • 評(píng)論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1811117
            • 排名 - 5

            最新評(píng)論

            閱讀排行榜

            午夜欧美精品久久久久久久 | 一本色道久久99一综合| 亚洲人成无码www久久久| 一本色道久久88—综合亚洲精品| 无遮挡粉嫩小泬久久久久久久| 国内精品久久久久伊人av| 国产精品永久久久久久久久久| 国产69精品久久久久9999APGF| 国产欧美久久久精品| 久久精品国产亚洲AV蜜臀色欲| 国产成人久久精品激情| 久久久午夜精品福利内容| 97久久精品无码一区二区| 国产精品久久久久久久app| 久久91精品国产91久久小草| 中文字幕久久亚洲一区| 免费精品99久久国产综合精品| 伊人久久精品无码二区麻豆| 久久青青草原精品国产软件| 久久九九全国免费| 久久精品中文騷妇女内射| 国产成人无码精品久久久性色| 久久无码AV中文出轨人妻 | 久久久黄色大片| 人妻无码久久精品| 久久电影网| 久久高清一级毛片| 国产精品成人99久久久久91gav| .精品久久久麻豆国产精品| 亚洲国产精品无码久久一线| 99久久这里只精品国产免费| 一级a性色生活片久久无少妇一级婬片免费放 | 伊人久久五月天| 亚洲欧美一区二区三区久久| 亚洲国产成人久久精品99| 合区精品久久久中文字幕一区| 久久久久久av无码免费看大片 | 国内精品综合久久久40p| 亚洲va久久久久| 精品永久久福利一区二区| 久久人人爽爽爽人久久久|