zoukankan      html  css  js  c++  java
  • 1.错误处理

    1.$err,hr可以看到系统ERR的文字描绘

    	HANDLE hMutex = CreateMutex(NULL, false, L"1");
    	HANDLE hEvent = CreateMutex(NULL, false, L"1");


    右键,添加监视:

    第一步,调试到第一个互斥量,我们假定整个名字空间不存在重名,那么应该是成功的,看对应的监视:

     $err,hr返回S_OK

    第二步,调试到第二个互斥量

    很明显,同名,同类型,应该返回ERROR_ALREADY_EXISTS

    b7也就是183,我们去WinError.h中找183L,果然发现如下信息:

    //
    // MessageId: ERROR_ALREADY_EXISTS
    //
    // MessageText:
    //
    // Cannot create a file when that file already exists.
    //
    #define ERROR_ALREADY_EXISTS             183L


    我们发现,每一个错误代码都由消息ID,消息文本,和一个编号组成,

    回到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
    //
    //
    // Define the facility codes
    //


    再对比下核心编程,

    31-30 29 28 27-16 15-0
    内容 严重性 Microsoft/客户 保留 Facility代码 异常代码
    含义

    0:成功

    1:信息

    2:警告

    3:错误

    0 =  微软预定义的代码

    1 = 客户定义的代码

    必须为0 前256个值由Microsoft保留 Microsoft/客户定义的代码

    好吧,我表示核心编程写得详细,要点是29位,如果要创建我们自己的错误代码,就必须在此位放一个1,通过这种方法来保证和预定义的错误码绝不冲突,

    随手写了个返回ERROR描绘的代码:

    CString GetMyLastError()
    {
    	DWORD dwError = ::GetLastError();
    	HLOCAL hlocal = NULL;   
    	DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
    	BOOL fOk = FormatMessage(
    		FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
    		FORMAT_MESSAGE_ALLOCATE_BUFFER, 
    		NULL, dwError, systemLocale, 
    		(PTSTR) &hlocal, 0, NULL);
    
    	CString szErr = _T("");
    	if (fOk)
    	{
    		szErr = (PCTSTR) LocalLock(hlocal);
    	}
    	LocalUnlock(hlocal);
    	LocalFree(hlocal);
    
    	return szErr;
    }
    

    有人可能觉得FormatMessage有点复杂,那么打开MSDN,找到Example Code

    #include <windows.h>
    #include <strsafe.h>
    
    void ErrorExit(LPTSTR lpszFunction) 
    { 
        // Retrieve the system error message for the last-error code
    
        LPVOID lpMsgBuf;
        LPVOID lpDisplayBuf;
        DWORD dw = GetLastError(); 
    
        FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            dw,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf,
            0, NULL );
    
        // Display the error message and exit the process
    
        lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
            (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); 
        StringCchPrintf((LPTSTR)lpDisplayBuf, 
            LocalSize(lpDisplayBuf),
            TEXT("%s failed with error %d: %s"), 
            lpszFunction, dw, lpMsgBuf); 
        MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); 
    
        LocalFree(lpMsgBuf);
        LocalFree(lpDisplayBuf);
        ExitProcess(dw); 
    }
    
    void main()
    {
        // Generate an error
    
        if(!GetProcessId(NULL))
            ErrorExit(TEXT("GetProcessId"));
    }
    
    


    照着抄吧。


     

  • 相关阅读:
    如何在Dreamweaver中使用emmet(ZenCoding)插件
    向Dreamwearer安装emmet插件时提示“无法更新菜单,将不会安装该扩展”的解决方法
    CSS层模型
    css布局模型
    元素分类
    段落排版--中文字间距、字母间距
    Qt 无边框
    QTimer.singleShot与QWidget初始化
    QNetworkAccessManager使用的简单封装
    Qt中用cJSON解析带中文的QString
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693542.html
Copyright © 2011-2022 走看看