青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級} {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)GUI應(yīng)用程序觸發(fā)一個消息時(shí),系統(tǒng)將把該消息放入消息隊(duì)列,然后去查找并調(diào)用窗體的消息處理函數(shù)(CALLBACK),傳遞的參數(shù)當(dāng)然就是這個消息。我們同樣可以把異常也當(dāng)作是一種消息,應(yīng)用程序發(fā)生異常時(shí)就觸發(fā)了該消息并告知系統(tǒng)。系統(tǒng)接收后同樣會找它的“回調(diào)函數(shù)”,也就是我們的異常處理例程。當(dāng)然,如果我們在程序中沒有做異常處理的話,系統(tǒng)也不會置之不理,它將彈出我們常見的應(yīng)用程序錯誤框,然后結(jié)束該程序。所以,當(dāng)我們改變思維方式,以CALLBACK 的思想來看待 SEH,SEH 將不再神秘。

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

r_no157.gif
一個簡單的使用SEH的例子

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

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


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



這個函數(shù)所做的一切就是將對s t r c p y的調(diào)用置于一個結(jié)構(gòu)化的異常處理框架中。如果s t r c p y執(zhí)行成功,函數(shù)就返回。如果s t r c p y引起一個存取異常,異常過濾器返回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í)行異常處理程序代碼。在這個函數(shù)中,處理程序代碼什么也不做,R o b u s t S t r C p y只是返回到它的調(diào)用者,根本不會造成進(jìn)程結(jié)束。

另一個使用:

#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)致一個存儲異常
* p? = ? 13 ;?

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

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


// ?呵呵,注意這條語句
puts( " 這里也不會被執(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

另一個混合c++的異常處理使用:

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

#include? " stdio.h " ?

class ?A?

{?

public :?

void ?f1()? {} ?

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

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

}
;?

// ?這個函數(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);?

}
?

}
?

// ?這個函數(shù)沒什么改變,仍然采用?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)致一個存儲異常?

* p? = ? 13 ;?

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

}
?

__finally?

{?

puts(
" in?finally " );?

}
?

puts(
" ?這里也不會被執(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é)果也是正確的(和預(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 夢在天涯 閱讀(23207) 評論(2)  編輯 收藏 引用 所屬分類: Windows API

評論

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

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

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1812030
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲人午夜精品| 欧美成人首页| 国内精品久久久久伊人av| 久久精品国产99国产精品| 欧美制服丝袜第一页| 国产一本一道久久香蕉| 麻豆精品在线视频| 久久精品视频免费观看| 亚洲经典三级| 99视频精品| 国产揄拍国内精品对白| 欧美第一黄网免费网站| 欧美人成在线| 欧美一区三区三区高中清蜜桃| 欧美一区二区精品久久911| 在线播放中文一区| 亚洲另类黄色| 国模大胆一区二区三区| 亚洲国产精品一区二区久| 国产精品mv在线观看| 久久久夜夜夜| 欧美精品一区二区视频| 久久久精品国产99久久精品芒果| 久久中文精品| 欧美一区二区成人| 欧美国产丝袜视频| 久久疯狂做爰流白浆xx| 欧美精品日韩| 久久久视频精品| 欧美日韩在线高清| 乱人伦精品视频在线观看| 欧美日韩亚洲综合在线| 久久婷婷国产综合尤物精品| 欧美日韩国产综合视频在线观看中文 | 日韩亚洲欧美一区| 国产一区二区久久精品| 亚洲日本精品国产第一区| 国产又爽又黄的激情精品视频| 亚洲毛片在线观看| 亚洲高清一区二区三区| 亚洲免费视频在线观看| 日韩亚洲欧美中文三级| 久久精品最新地址| 翔田千里一区二区| 欧美日韩xxxxx| 免费h精品视频在线播放| 国产欧美日韩视频一区二区三区 | 久久精品亚洲国产奇米99| 欧美日韩情趣电影| 亚洲国产国产亚洲一二三| 国内精品久久久久久| 午夜精品一区二区在线观看| 亚洲色诱最新| 欧美日韩不卡| 亚洲日韩欧美视频| 亚洲精品亚洲人成人网| 免费观看亚洲视频大全| 欧美成人免费一级人片100| 国产一区在线播放| 久久精品视频在线观看| 浪潮色综合久久天堂| 狠狠色狠色综合曰曰| 久久九九电影| 蜜桃久久av| 在线国产欧美| 免费成人av| 亚洲国产精彩中文乱码av在线播放| 在线播放中文字幕一区| 老司机凹凸av亚洲导航| 亚洲国产一区二区三区a毛片| 最新中文字幕亚洲| 欧美母乳在线| 一区二区三区欧美日韩| 午夜久久影院| 韩日精品在线| 美女图片一区二区| 最近看过的日韩成人| 中文在线不卡视频| 国产精品入口日韩视频大尺度| 亚洲天天影视| 久久免费视频网| 亚洲国产高清一区二区三区| 免费在线观看一区二区| 亚洲精品中文字幕有码专区| 亚洲欧美日韩精品久久奇米色影视 | 久久久精品日韩欧美| 欧美福利在线| 中文一区二区| 国内精品久久久久国产盗摄免费观看完整版 | 99视频精品免费观看| 国产精品wwwwww| 久久久777| 亚洲女与黑人做爰| 国产日韩欧美日韩| 男人天堂欧美日韩| 一本一道久久综合狠狠老精东影业 | 亚洲色诱最新| 国内综合精品午夜久久资源| 欧美成人tv| 亚洲欧美日韩成人| 亚洲大胆人体在线| 欧美一区二区三区免费看| 在线精品亚洲| 国产精品毛片a∨一区二区三区| 久久精品亚洲| 亚洲先锋成人| 亚洲国产欧美一区| 久久久久成人精品| 亚洲视频一二三| 亚洲风情亚aⅴ在线发布| 国产精品久久婷婷六月丁香| 蜜桃av一区二区| 亚洲女人小视频在线观看| 亚洲缚视频在线观看| 欧美在线网站| 亚洲一区二区精品在线| 亚洲激情另类| 在线激情影院一区| 国产亚洲欧美日韩一区二区| 欧美视频在线一区二区三区| 狂野欧美一区| 欧美在线观看你懂的| 亚洲天堂网在线观看| 日韩视频精品在线观看| 亚洲成人在线视频播放 | 国外精品视频| 国产女精品视频网站免费 | 欧美日韩国产色综合一二三四| 欧美在线观看一区| 亚洲男女自偷自拍| 99视频超级精品| 日韩一区二区精品| 亚洲精品女人| 欧美+日本+国产+在线a∨观看| 久久成人一区| 久久久久国产精品厨房| 欧美亚洲网站| 久久国产精品一区二区三区| 久久aⅴ国产欧美74aaa| 欧美一级大片在线观看| 亚洲欧美在线观看| 性色av香蕉一区二区| 午夜精品视频在线观看| 午夜久久美女| 久久综合99re88久久爱| 久久午夜视频| 欧美黄色成人网| 亚洲国产黄色片| 亚洲精品一区二| 一区二区毛片| 亚洲伊人第一页| 欧美一级艳片视频免费观看| 欧美一区二区精品久久911| 欧美专区在线观看| 久久亚洲二区| 欧美激情精品久久久久久蜜臀| 欧美护士18xxxxhd| 欧美日韩一区在线播放| 国产精品久久久久av| 国产美女精品视频免费观看| 国产午夜亚洲精品不卡| 伊人成人在线| 日韩亚洲欧美在线观看| 性伦欧美刺激片在线观看| 中日韩视频在线观看| 欧美一区二区三区视频在线观看| 先锋影音国产一区| 久久婷婷影院| 欧美日韩一区二区三区视频| 国产精品区一区| 1000部精品久久久久久久久| 亚洲精品一区二区三区av| 亚洲男人天堂2024| 久久一区二区精品| 亚洲精品欧美激情| 久久福利一区| 欧美日韩99| 狠狠入ady亚洲精品经典电影| 亚洲国产一区二区三区a毛片| 亚洲一区在线视频| 免费成人av在线| 国产精品99久久久久久久女警| 久久精品国产综合精品| 欧美天堂亚洲电影院在线观看 | 欧美视频观看一区| 樱桃成人精品视频在线播放| 一本色道久久88综合亚洲精品ⅰ| 欧美一级视频免费在线观看| 亚洲电影网站| 久久黄色网页| 国产精品久久久久久久久久久久久 | 久久久成人精品| 99re6热只有精品免费观看| 久久精品免费电影| 欧美性天天影院| 最新日韩精品| 欧美成人免费网站| 久久国产天堂福利天堂| 欧美性生交xxxxx久久久| 亚洲美女网站|