• 自己写的获取GetLastError()错误码对应的信息字符串的函数StringError()(2015-1-18更新)


    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     * 函数名称:StringError
     * 功能说明:获取GetLastError()函数返回的错误码对应的信息字符串。本函数线程安全。
                 lmerr.h、netmsg.dll模块包含NERR_BASE(2100)至MAX_NERR(2999)的错误码对应的信息字符串。
                 wininet.h、wininet.dll模块包含INTERNET_ERROR_BASE(12000)至INTERNET_ERROR_LAST(12175)的错误码对应的信息字符串。
                 pdhmsg.h、pdh.dll模块包含PDH_CSTATUS_VALID_DATA(0)至PDH_CSTATUS_NEW_DATA(1)、PDH_CSTATUS_NO_MACHINE(2147485648)至PDH_QUERY_PERF_DATA_TIMEOUT(3221228542)的错误码对应的信息字符串。
                 系统包含WSA错误码10000至11999、IPSec错误码13000至13999、Side By Side错误码14000至14999、WinEvt错误码15000至15079、Wecsvc错误码15080至15099、
                         MUI错误码15100至15199、Monitor Configuration API错误码15200至15249、Syspart错误码15250至15299、Vortex错误码15300至15320、
                         及其他的错误码对应的信息字符串。
     * 参数说明:ulErrorNumber:存放GetLastError()函数返回的错误码的值。
     * 返回说明:非NULL:信息字符串的内存指针。
                 NULL:未找到错误码对应的信息字符串。
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    
    const char * CFunc::StringError(DWORD ulErrorNumber)
    {
        int iStringLength;
        __declspec(thread) static char szErrorString[1024];//存放信息字符串的线程局部内存
        __declspec(thread) static HMODULE hNetmsgModule = NULL;//存放netmsg.dll模块句柄的线程局部内存
        __declspec(thread) static HMODULE hWininetModule = NULL;//存放wininet.dll模块句柄的线程局部内存
        __declspec(thread) static HMODULE hPdhModule = NULL;//存放pdh.dll模块句柄的线程局部内存
        
        if ((ulErrorNumber >= NERR_BASE) && (ulErrorNumber <= MAX_NERR))//如果是lmerr.h、netmsg.dll模块包含的错误码
        {
            if (hNetmsgModule == NULL)//如果netmsg.dll模块还没有加载过
            {
                hNetmsgModule = LoadLibraryEx ("netmsg.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);//加载netmsg.dll模块
    
                if (hNetmsgModule == NULL)
                {
                    return NULL;
                }
            }
    
            //在指定模块里查找错误码对应的信息字符串
            iStringLength = FormatMessage (FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, hNetmsgModule, ulErrorNumber, 0, szErrorString, sizeof (szErrorString), NULL);
        }
        else if ((ulErrorNumber >= INTERNET_ERROR_BASE) && (ulErrorNumber <= INTERNET_ERROR_LAST))//如果是wininet.h、wininet.dll模块包含的错误码
        {
            if (hWininetModule == NULL)//如果wininet.dll模块还没有加载过
            {
                hWininetModule = LoadLibraryEx ("wininet.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);//加载wininet.dll模块
    
                if (hWininetModule == NULL)
                {
                    return NULL;
                }
            }
    
            //在指定模块里查找错误码对应的信息字符串
            iStringLength = FormatMessage (FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, hWininetModule, ulErrorNumber, 0, szErrorString, sizeof (szErrorString), NULL);
        }
        else if ((ulErrorNumber >= PDH_CSTATUS_NO_MACHINE) && (ulErrorNumber <= PDH_QUERY_PERF_DATA_TIMEOUT))//如果是pdhmsg.h、pdh.dll模块包含的错误码
        {
            if (hPdhModule == NULL)//如果pdh.dll模块还没有加载过
            {
                hPdhModule = LoadLibraryEx ("pdh.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);//加载wininet.dll模块
    
                if (hPdhModule == NULL)
                {
                    return NULL;
                }
            }
    
            //在指定模块里查找错误码对应的信息字符串
            iStringLength = FormatMessage (FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, hPdhModule, ulErrorNumber, 0, szErrorString, sizeof (szErrorString), NULL);
        }
        else//如果是其他系统的错误码
        {
            //在系统里查找错误码对应的信息字符串
            iStringLength = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ulErrorNumber, 0, szErrorString, sizeof (szErrorString), NULL);
        }
        
        if (iStringLength > 0)//如果成功获取到信息字符串,去掉字符串末尾的“
    ”
        {
            if (szErrorString[iStringLength - 2] == '
    ')
            {
                if (szErrorString[iStringLength - 1] == '
    ')
                {
                    iStringLength -= 2;
                }
                else
                {
                    iStringLength--;
                }
    
                szErrorString[iStringLength] = '';
            }
    
            return szErrorString;
        }
        else
        {
            return NULL;
        }
    }
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 二元函数
    Java实现 蓝桥杯VIP 算法训练 二元函数
    Java实现 蓝桥杯VIP 算法训练 二元函数
    Java实现 蓝桥杯VIP 算法训练 二元函数
    Java实现 蓝桥杯VIP 算法训练 二元函数
    创建虚拟桌面的代码(重启桌面进程)(使用GetThreadDesktop,CreateDesktop,SetThreadDesktop等函数)
    SEH and C++ Exceptions,自定义CSeException
    VC自动与Internet时间服务器同步更新
    VS2005 检测内存泄漏的方法(转载)
    VC判断当前用户有无Administrator的权限(用EqualSid API函数判断与Admin是否在一个组的Sid)
  • 原文地址:https://www.cnblogs.com/gaoyaguo/p/3607251.html
Copyright © 2020-2023  润新知