FormatMessage函式封裝

2021-10-06 05:33:23 字數 1744 閱讀 2673

函式的返回值和錯誤碼對判斷函式的執行結果和失敗原因有重要的價值。每個使用windows api進行c++程式設計的老鐵們都自己封裝過formatmessage這個函式,我用了快一年才想到自己去封裝它以提高便攜性。

函式myformatmessage列印函式執行狀態及對應的提示資訊。

dword 

myformatmessage

( tchar *funcname,

dword errcode =0)

formatmessage

( format_message_allocate_buffer |

format_message_from_system |

format_message_ignore_inserts,

null

, dw,

makelangid

(lang_neutral, sublang_default)

,(lptstr)

&lpmsgbuf,0,

null);

stringcchprintf

(lpdisplaybuf,

1024,_t

("function: %s failed with %#x: %s"

), funcname, dw, lpmsgbuf)

;_tprintf(_t

("%s"

), lpdisplaybuf)

;localfree

(lpmsgbuf)

;return dw;

}

funcname與函式執行無關,僅拼接在列印資訊中以指示錯誤碼發生在哪個函式的呼叫中

errcode不傳入該引數時,函式將使用自己呼叫getlasterror()取得的錯誤碼,否則使用傳入的錯誤碼

函式的errcode引數傳0時,返回函式自身呼叫getlasterror()取得的錯誤碼,或者返回由errcode傳入的非0錯誤碼(將錯誤碼再次傳出的目的是為了復用)

#include

"stdafx.h"

#include

#include

#include

#include

#include

#pragma comment(lib, "shlwapi.lib")

/* * 這裡為了節約篇幅摺疊了myformatmessage函式的定義

*/int

main()

return0;

}

結果

分析

呼叫該函式前應該使用 setlocale(lc_ctype, 「chs」) 設定好語言環境,不然中文無法正確顯示。

第一次呼叫 pathfileexists 的列印結果可能會令人疑惑,通常情況下這一次的呼叫都是成功的(除非你手賤刪掉了該路徑下的notepad.exe檔案),但是errcode的值卻是 1,這是為甚麼呢?

其實是我先入為主地認為 pathfileexists 在成功是返回 0,而在出錯時返回錯誤碼,但是游標放到該函式上按f1來開啟msdn檢視幫助手冊可以知道,該函式在成功是返回 true(即1),在出錯時返回 0,原因就出在這裡。

FormatMessage簡單說明

常用引數簡介.formatmessage format message from system format message allocate buffer,null,lval,null,lptstr hlocal,0,null 第乙個引數是標誌,告訴這個formatmessage函式,我想要的特點...

FormatMessage通過錯誤碼取出錯誤文字

get the error code dword dwerror getdlgitemint hwnd,idc errorcode,null,false handle hlocal null buffer that gets the error message string get the erro...

函式基礎 匿名函式,函式,箭頭函式,立即執行函式

doctype html html lang en head meta charset utf 8 meta name viewport content width device width,initial scale 1.0 title document title head body body ...