您的位置:首页 > 其它

experiment: 自定义错误码的宏 MAKE_EC_ERROR_CODE

2013-04-15 16:56 197 查看
做了一个宏 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");  
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐