/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 函數名稱: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至1199九、IPSec錯誤碼13000至1399九、Side By Side錯誤碼14000至1499九、WinEvt錯誤碼15000至1507九、Wecsvc錯誤碼15080至1509九、 MUI錯誤碼15100至1519九、Monitor Configuration API錯誤碼15200至1524九、Syspart錯誤碼15250至1529九、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)//若是成功獲取到信息字符串,去掉字符串末尾的「\r\n」 { if (szErrorString[iStringLength - 2] == '\r') { if (szErrorString[iStringLength - 1] == '\n') { iStringLength -= 2; } else { iStringLength--; } szErrorString[iStringLength] = '\0'; } return szErrorString; } else { return NULL; } }