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

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>
              欧美日韩一区二区在线视频 | 一区二区三区日韩欧美| 国产日韩精品在线播放| 国产精品久久久久一区二区三区共 | 欧美日韩小视频| 国产精品美女久久福利网站| 国产精品色在线| 国产性猛交xxxx免费看久久| 国产专区精品视频| 亚洲国产美女久久久久| 日韩一级在线| 午夜精品在线看| 欧美一区二区高清在线观看| 久久综合五月| 久久久久久久999| 亚洲欧洲另类| 亚洲少妇中出一区| 久久久久久**毛片大全| 欧美黑人一区二区三区| 中文成人激情娱乐网| 亚洲欧美日韩国产综合在线 | 久热这里只精品99re8久| 欧美理论在线播放| 好看不卡的中文字幕| 日韩亚洲国产欧美| 久久噜噜噜精品国产亚洲综合| 亚洲成人在线免费| 欧美大片一区二区| 国产欧美精品一区| 亚洲美女尤物影院| 久久综合99re88久久爱| 亚洲一区二区高清视频| 欧美高清在线观看| 激情伊人五月天久久综合| 国产精品99久久久久久久久久久久| 久久成人av少妇免费| 亚洲人成网站影音先锋播放| 欧美一级淫片aaaaaaa视频| 欧美精品一区二区三区久久久竹菊 | 久久精品电影| 日韩一级二级三级| 久久深夜福利免费观看| 国产农村妇女毛片精品久久麻豆| 亚洲乱码一区二区| 欧美激情亚洲激情| 久久精品一本| 国产日产亚洲精品| 性做久久久久久久免费看| 亚洲精品在线免费观看视频| 久久久久久综合网天天| 国产日韩欧美综合在线| 午夜视频在线观看一区二区三区| 亚洲片国产一区一级在线观看| 久久亚洲视频| 在线看片日韩| 久热这里只精品99re8久| 欧美在线免费看| 国产视频综合在线| 久久精品国产精品亚洲综合| 这里是久久伊人| 亚洲精品视频一区| 麻豆精品网站| 久久gogo国模裸体人体| 国产亚洲精品久久久| 欧美呦呦网站| 欧美一区二区女人| 1769国产精品| 亚洲国产精品va| 欧美日韩 国产精品| 一本色道久久综合狠狠躁篇的优点| 亚洲电影天堂av| 欧美另类视频在线| 亚洲欧美韩国| 小黄鸭精品aⅴ导航网站入口| 国产精品午夜久久| 久久久久久久久蜜桃| 久久综合久久久久88| 99在线精品观看| 亚洲一区二区三区午夜| 国产三级欧美三级日产三级99| 久久精品人人做人人爽| 久久先锋影音av| 一区二区三区精品久久久| 亚洲午夜久久久久久尤物 | 免费日韩av| 99国产一区| 亚洲制服av| 影院欧美亚洲| 亚洲精品日韩综合观看成人91| 国产精品theporn| 久久一区亚洲| 欧美精品在欧美一区二区少妇| 亚洲欧美激情视频| 久久婷婷久久| 亚洲欧美日韩中文播放| 久久成人综合视频| 99re6这里只有精品视频在线观看| 亚洲网站视频| 亚洲国产精品综合| 亚洲欧美日韩精品在线| 日韩视频免费观看高清在线视频| 亚洲欧美激情四射在线日| 亚洲人体影院| 久久久久久久性| 亚洲欧洲av一区二区| 你懂的视频欧美| 久久国产乱子精品免费女 | 欧美资源在线观看| 亚洲视频中文| 老司机aⅴ在线精品导航| 亚洲综合电影| 欧美激情一区| 欧美大片一区| 激情久久久久久久| 亚洲欧洲99久久| 亚洲午夜国产一区99re久久| 免费久久99精品国产自在现线| 久久久精品日韩| 国产乱码精品一区二区三区忘忧草| 亚洲国产精品精华液2区45| 中文亚洲视频在线| 国产精品视频久久久| 最新日韩欧美| 亚洲国产视频一区二区| 久久av资源网| 久久久久久久波多野高潮日日| 国产精品欧美风情| 夜夜嗨av一区二区三区网站四季av| 亚洲电影免费观看高清完整版| 久久国产手机看片| 久久久999精品视频| 国产欧美日韩专区发布| 亚洲欧美日韩国产一区二区| 午夜精品福利在线| 国产精品中文字幕欧美| 亚洲综合久久久久| 性色av一区二区三区红粉影视| 国产精品99免费看| 99精品欧美一区| 亚洲伊人第一页| 国产精品人人爽人人做我的可爱| 99亚洲视频| 亚洲免费在线观看| 国产毛片一区| 欧美一区中文字幕| 猫咪成人在线观看| 亚洲国产美女精品久久久久∴| 欧美大片91| 亚洲午夜影视影院在线观看| 性色av一区二区三区| 一区在线播放| 欧美激情一区二区三区高清视频 | 亚洲伦理网站| 欧美视频日韩视频在线观看| 亚洲午夜伦理| 欧美aa国产视频| 91久久线看在观草草青青| 欧美日韩一区二区三区在线视频| aa日韩免费精品视频一| 久久国产高清| 在线看国产日韩| 欧美日韩免费一区二区三区| 亚洲欧美日韩国产| 亚洲国产高清aⅴ视频| 午夜精彩国产免费不卡不顿大片| 国产一区二区三区免费观看| 欧美成人精品三级在线观看 | 亚洲精品美女在线| 香蕉久久精品日日躁夜夜躁| 国语自产在线不卡| 欧美精品一级| 欧美一区二区免费观在线| 亚洲日本一区二区三区| 久久精品99国产精品日本 | 久热综合在线亚洲精品| 亚洲免费观看| 国内精品久久国产| 欧美日韩国产va另类| 久久国产88| 中文一区在线| 亚洲国产精品福利| 久久不射2019中文字幕| 一区二区三区 在线观看视频 | 黄色精品一二区| 久久天天狠狠| 亚洲一区二区三区乱码aⅴ| 噜噜噜躁狠狠躁狠狠精品视频| 艳妇臀荡乳欲伦亚洲一区| 国产欧美日韩综合一区在线观看| 欧美大片一区二区三区| 久久成人18免费网站| 亚洲视频国产视频| 亚洲人在线视频| 欧美成人午夜激情在线| 久久精品视频在线观看| 亚洲欧美偷拍卡通变态| 亚洲一卡久久| 最新中文字幕亚洲| 黄色成人免费网站| 国语自产偷拍精品视频偷|