SEH 可以在 C 程式中使用

2021-04-07 02:18:22 字數 2495 閱讀 6578

**自http://blog.programfan.com/article.asp?id=9864

首先宣告的是, c++ 中的異常處理機制是建立在 windows 平台上的 seh 機制之上,所以 seh 當然可以在 c++ 程式中使用。不過「阿愚」多次強調過,我們平常一般狹義上的 seh 都是指 try-except 和 try-finally 異常機制,而它們是給 c 語言( vc 環境)編寫 windows driver 而設計的,所以 seh 主要應該在 c 程式中被使用,而 c++ 程式則應該使用 try-catch 機制的 c++ 異常處理模型( micorsoft 的 msdn 一直強烈建議程式設計師遵循此規則)。但是, seh 到底能在 c++ 程式中使用嗎?「當然可以,肯定可以」,其實在一開始闡述 windows 平台多種異常機制之間的關係時,就已經清楚地表明了這一點。

這篇文章系統地來看看 seh 在 c++ 程式中的各種使用情況。

其實簡單的例子,就是把以前的使用 seh 機制的 c 程式,改稱 c++ 程式,看它能正常編譯和執行否?什麼意思,很簡單,就是把原來的 .c 程式的副檔名改為 .cpp 檔案,也即此時 vc 編譯器會採用 c++ 語言來編譯此程式(這也即為 c++ 程式了)。朋友們試試吧!**如下:

// 注意,這是 c++ 程式,檔名為: seh-test.cpp

#include "stdio.h"

void test()

int* p = 0x00000000; // pointer to null

__try

puts("in try");

__try

puts("in try");

// causes an access violation exception;

// 導致乙個儲存異常

*p = 13;

puts(" 這裡不會被執行到 ");

__finally

puts("in finally");

puts(" 這裡也不會被執行到 ");

__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");

是不是能編譯通過,而且執行結果也和以前 c 程式的執行結果完全一致,如下:

hello

in try

in try

in filter 1

in filter 2

in finally

in except 2

world

press any key to continue

也許很多程式設計師朋友對上面的例子不以為然,覺得它說明不了什麼問題。好的,現在我們來看乙個 真正意義上的 c++ 程式,且使用 seh 機制。什麼是真正意義上的 c++ 程式,當然是採用了物件導向技術。看例子吧!**如下(其實就是在上面程式的基礎上加了乙個 class ):

// 注意,這是 c++ 程式,檔名為: seh-test.cpp

#include "stdio.h"

class a

public:

void f1() {}

void f2() {}

void test1()

a a1;

a a2,a3;

a2.f1();

a3.f2();

void test()

int* p = 0x00000000; // pointer to null

__try

// 這裡呼叫 test1 函式,它函式內部會創造 object

// 應該屬於 100% 的 c++ 程式了吧!

test1();

puts("in try");

__try

puts("in try");

// causes an access violation exception;

// 導致乙個儲存異常

*p = 13;

puts(" 這裡不會被執行到 ");

__finally

puts("in finally");

puts(" 這裡也不會被執行到 ");

__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");

在C 程式中使用系統熱鍵

1.首先引入system.runtime.interopservices using system.runtime.interopservices 2.在類內部宣告兩個api函式,它們的位置和類的成員變數等同.system.runtime.interopservices.dllimport user...

在C 程式中使用系統熱鍵

在c 程式中使用系統熱鍵 分類 winform 2009 1 18 13 22 44 junglesong.1.首先引入system.runtime.interopservices usingsystem.runtime.interopservices 2.在類內部宣告兩個api函式,它們的位置和類...

在C 程式中使用ocx的方法

在做乙個wpf的專案時 vs2008,c 需要引用乙個使用c 編譯的ocx元件,但是執行的時候經常報錯,無法使用其中提供的介面和方法。上網查了一下解決辦法,方法很多,但是很多都沒有奏效。最終找到了乙個比較有效的方法,下面就是在我的程式中能夠成功使用的例子,分享一下。雖然已經是去年的了 1 在c 工程...