做了一个宏 MAKE_EC_ERROR_CODE, 用于自定义错误码.
可能还需要加几个宏来判断是否是自定义错误码, 是否是某工程的宏, 用起来才方便.
// UserErrorCodeDefine.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <Windows.h> /// @ref /// http://www.cppblog.com/twzheng/articles/20519.html /// http://blog.csdn.net/hgy413/article/details/7422722 /// WinError.h /** // Values are 32 bit values laid out as follows: // // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 // +---+-+-+-----------------------+-------------------------------+ // |Sev|C|R| Facility | Code | // +---+-+-+-----------------------+-------------------------------+ // // where // // Sev - is the severity code // // 00 - Success // 01 - Informational // 10 - Warning // 11 - Error // // C - is the Customer code flag // // R - is a reserved bit // // Facility - is the facility code // // Code - is the facility's status code */ /** ////////////////////////////////////////////////////////////////////////// MS 错误码定义 ////////////////////////////////////////////////////////////////////////// 位 内容 [31–30] 严重性 [29] Microsoft/客户 [28] 保留 [27–16] 设备代码 [15–0] 异常代码 ////////////////////////////////////////////////////////////////////////// 错误码字段含义 ////////////////////////////////////////////////////////////////////////// [严重性] 0 = 成功 1 = 信息(提示) 2 = 警告 3 = 错误 [Microsoft/客户] 0 = Microsoft定义的代码 1 = 客户定义的代码 [保留] 必须为0 [设备代码] 前256个值由Microsoft保留, 没看到哪有说, 看到 WinError.h 中定义了一些 [异常代码] Microsoft/客户定义的代码 */ /// EC means error code #define EC_LEVEL_OK 0 ///< 错误级别: 成功 #define EC_LEVEL_INFO 1 ///< 错误级别: 信息(提示) #define EC_LEVEL_WARN 2 ///< 错误级别: 警告 #define EC_LEVEL_ERR 3 ///< 错误级别: 错误 #define EC_OWNER_MS 0 ///< 错误码定义者: MS #define EC_OWNER_USR 1 ///< 错误码定义者: 用户 #define EC_RESERVE 0 ///< 保留值定义 #define EC_DEV_CODE_BEGIN 0x101 ///< 用户设备代码的起始值, 0~256为MS定义的设备类型 /// 每个工程需要自定义的工程系列编号和错误码 #define EC_DEVCODE_PRJXX 1 ///< 工程或系统系列代号: 0~(0xfff - 0x100) #define EC_USRCODE_USRXX 1 ///< 属于 EC_USER_DEV_PRJXX 工程的错误代码, 0~0xffff /// fnShowBinaryData 用的宏, 仅用于显示 #define STR_ONE L"1" #define STR_ZERO L"0" #define BYTE_BITS 8 /// 用户自定义错误码宏定义 #define MAKE_EC_LEVEL(x) (DWORD)((DWORD)((x) & 0x3) << 30) #define MAKE_EC_OWNER(x) (DWORD)(((DWORD)(x) & 0x1) << 29) #define MAKE_EC_DEV(x) (DWORD)((((DWORD)(x) + EC_DEV_CODE_BEGIN) & 0xfff) << 16) #define MAKE_EC_DEFINE(x) (DWORD)((DWORD)(x) & 0xffff) #define MAKE_EC_ERROR_CODE(iLevel,iOwner,iDevCode,wErrCode) \ ( MAKE_EC_LEVEL(iLevel) \ | MAKE_EC_OWNER(iOwner) \ | MAKE_EC_DEV(iDevCode) \ | MAKE_EC_DEFINE(wErrCode)) void fnShowBinaryData(DWORD dwData, size_t nDataTypeByteCnt); int _tmain(int argc, _TCHAR* argv[]) { int iLevel = 0; int iOwner = EC_OWNER_USR; ///< 只测试自定义错误码 int iDevCode = 0; WORD wErrCode = 0; /// 定义显示一个用户自定义错误码 fnShowBinaryData(MAKE_EC_ERROR_CODE(EC_LEVEL_ERR, EC_OWNER_USR, EC_DEVCODE_PRJXX, EC_USRCODE_USRXX),sizeof(DWORD)); /** Binary Data [0xE1020001] = 1110,0001,0000,0010,0000,0000,0000,0001 */ /// 测试所有可能的用户自定义错误码 _tprintf(L"\r\n\r\n"); for (iLevel = 0; iLevel <= 3; iLevel++) { for (iDevCode = 0; iDevCode <= (0xfff - 0x100); iDevCode++) { for (wErrCode = 0; wErrCode <= 0xffff; wErrCode++) { fnShowBinaryData(MAKE_EC_ERROR_CODE(iLevel, EC_OWNER_USR, iDevCode, wErrCode),sizeof(DWORD)); } } } /** Binary Data [0x21010000] = 0010,0001,0000,0001,0000,0000,0000,0000 Binary Data [0x21010001] = 0010,0001,0000,0001,0000,0000,0000,0001 Binary Data [0x21010002] = 0010,0001,0000,0001,0000,0000,0000,0010 Binary Data [0x21010003] = 0010,0001,0000,0001,0000,0000,0000,0011 ... */ getwchar(); return 0; } void fnShowBinaryData(DWORD dwData, size_t nDataTypeByteCnt) { int iPos = 0; int iPosTag = 0; int iRorBits = 0; int dwDataRorAfter = 0; int iDataBitsNeedRor = static_cast<int>(BYTE_BITS) * nDataTypeByteCnt - 1; _tprintf(L"Binary Data [0x%X] = ", dwData); for (iPos = 0; iPos <= iDataBitsNeedRor; iPos++) { iRorBits = iDataBitsNeedRor - iPos; dwDataRorAfter = dwData >> iRorBits; _tprintf(L"%s", (dwDataRorAfter & 1) ? STR_ONE : STR_ZERO); /// 每打印4位, 加一个分隔符 if ((0 == (++iPosTag % (BYTE_BITS / 2))) && (iPos < iDataBitsNeedRor)) { _tprintf(L","); } } _tprintf(L"\n"); }