一 函式錯誤機制

2021-08-17 14:22:59 字數 862 閱讀 2502

對於呼叫某些windows函式,不論成功與否,都會有乙個與之對應的**值來標識函式的呼叫情況,是成功或是失敗,如果失敗,則可根據該值進一步獲取失敗的原因。**值的獲取通過呼叫函式getlasterror,該函式是執行緒安全的,因為獲取的是主調執行緒中的錯誤**值,其原理是使用執行緒本地儲存區來存放了錯誤**值。另外,對於某些函式(如createevent),函式呼叫成功後也可以呼叫getlasterror函式來獲取相應的額外資訊。在vs中可以在程式除錯下狀態的watch視窗中輸入"$err,hr"可實時檢視windows函式對於錯誤**的設定情況.

與之對應的錯誤**值的設定即通過setlasterror函式來實現,所以,我們可以將這一機制用於我們自己的函式或者庫中供他人使用,不過值得注意的是,對於錯誤**值設定有一定的要求,每個位元位都是有含義的。

當我們獲取到乙個錯誤**值需要知道其含義時,這時就可以利用formatmessage函式來實現,該函式主要用來格式化訊息,或根據錯誤**獲取對應的訊息含義後再進行格式化(格式化是可選的,根據實際情況而定)。該函式獲取訊息的**主要有三處:1、給定的記憶體緩衝區;2、已載入模組(exe、dll等)的訊息資源表中;3、系統訊息資源表

windows系統自帶了乙個名為netmsg.dll的模組,該模組包含與網路相關的錯誤**的訊息檔案表,其錯誤**範圍為:nerr_base(2100) --- max_nerr(2100 + 899).

1、建立訊息文字檔案,即.mc檔案;

2、利用vs自帶的訊息編譯工具message compiler(mc.exe) 對.mc檔案進行編譯並生成.rc的資源檔案和相應的標頭檔案;

3、將標頭檔案和資源檔案放入到模組(dll或exe)所在的工程中,將其編譯在一起,這樣後面就可以在該模組中查詢錯誤**資訊了。

具體例子可參見 

回射函式錯誤分析

回射函式str cli.c 正常情況下,1.客戶程式傳送文字行,伺服器程式回射文字行。2.客戶程式提前終止,伺服器程式響應終止 如 child 10128 terminated 3.伺服器程式提前終止,客戶程式響應終止 str cli server terminated prematurely 然後...

類空指標訪問成員函式錯誤

今天好不容易調好環境準備執行一下別人的 執行到一半出現了類空指標錯誤 引發了異常 讀取訪問許可權衝突。this tree 是 nullptr。檢視了變數,程式初始化了乙個類指標tree,其為null。查閱相關資料了解到,此處的問題在於,空的類指標呼叫成員函式,如果該成員函式涉及訪問this指標,則會...

mq open 函式的 attr 引數錯誤問題

man mq open顯示 mqd t mq open const char name,int oflag mqd t mq open const char name,int oflag,mode t mode,struct mq attr attr 可見,該函式的用法有兩種,2個或者4個引數,然而...