windowsΪ´íÎó´¦ÀíÌṩÁ˺ܶຯÊý¡£
Ê×ÏȳýÁËGetLastError»¹ÓÐÒ»¸öGetLastErrorExº¯Êý¡£µ«ÊÇÏÖÔÚ
GetLastErrorExºÍGetLastError¶¼ÊÇÏàͬµÄÁË¡£ËùÒÔGetLastErrorExµÄµÚ¶þ²ÎÊý±»ºöÂÔÁË¡£
GetLastErrorº¯ÊýÀ´ÈÃÎÒÃǼì²éº¯Êý²Ù×÷ʱ²úÉúµÄ´íÎó¡£ËüʹÓÃÒ»ÖÖ½Ð×ö“Ï̱߳¾µØ´æ´¢Çø”£¨thread-local storage£©µÄ»úÖÆ½«ÏàÓ¦µÄ´íÎó´úÂëºÍÖ÷µ÷Ï̹߳ØÁªµ½Ò»Æð¡£
ͨ³£ÎÒÃÇʹÓÃÕâ¸öº¯ÊýÖ»ÐèÒªÀàËÆÏÂÃæÕâÑù¾Í¿ÉÒÔÁË¡£
HANDLE file = CreateFile(TEXT("C:\\test.txt"), 0, 0, nullptr, OPEN_EXISTING, 0, nullptr); DWORD dwResoult=GetLastError(); switch (dwResoult) { //... }
ËùÓеĴíÎóÂë¶¼ÔÚWinErrorÖж¨Òå×Å£¨±»Windows.h°üÀ¨£©¡£µ±È»ÏëÈ«²¿¼ÇÏÂÀ´ÊDz»¿ÉÄܵÄÖ»Äܱßѧϰ±ß»ýÀÛÁË¡£
ΪÁËÎÒÃǵ÷ÊÔ³ÌÐòµÄ·½±ãvisual studioΪÎÒÃÇÌṩÁËÏàÓ¦µÄ¹¤¾ßÀ´²é¿´´íÎóÂë¡£
¼àÊÓ´°¿Ú
ÎÒÃÇÖ»ÐèÒª´òÉ϶ϵãÈ»ºóÔÚ¼àÊÓ´°¿Ú£¨watch£©Ð´ÈëÏÂÃæÎ±±äÁ¿¾Í¿ÉÒԲο¼¶Ïµã´¦µÄGetLastError·µ»ØµÄ½á¹ûÁË¡£
ºÜ·½±ã »¹»á×Ô¶¯·Òë³ÉÎÒÃǵÄÓïÑÔ¡£
Èç¹ûÏëÁ˽âÍæÊ²Ã´¼àÊÓ´®¿ÚÍæÊ²Ã´»áÏÔʾ£¿£¿£¿¿ÉÒԲο¼ÏÂÃæÁ´½Ó£¨ÒªvpnµÄ£©
https://stackoverflow.com/questions/4001023/what-do-question-marks-in-visual-studio-watch-window-signify
´íÎó²éÕÒ
windows »¹ÓÐÒ»¸öС¹¤¾ß¿ÉÒԲ鿴ÏàÓ¦´íÎóÂëÊÇʲôÒâ˼
µ«ÊÇÖ»ÄÜÊäÈëÊý×Ö£¬²»ÄÜÊäÈëºêŶ¡£
ÏàÓ¦µÄAPI
µ±È»Èç¹ûÏëʵÏÖÉÏÃæµÄ¹¤¾ßµÄ»°windows Ò²ÌṩÁËÏàÓ¦µÄapi¡£
Ê×ÏÈÎÒÃÇÒªÓÃGetLastErrZ†·Ÿ"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcsC0u/G1w7TtzvPC66OoRFdPUkTWtaOpoaPIu7rzvs3Tw7W9z8LD5rXEuq/K/cHLPC9wPg0KPHByZSBjbGFzcz0="brush:java;">
//ÏÂÃæÊÇUNICODE°æ±¾µÄ
WINBASEAPI
_Success_(return != 0)
DWORD
WINAPI
FormatMessageW(
_In_ DWORD dwFlags,
_In_opt_ LPCVOID lpSource,
_In_ DWORD dwMessageId,
_In_ DWORD dwLanguageId,
_When_((dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) != 0, _At_((LPWSTR*)lpBuffer, _Outptr_result_z_))
_When_((dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) == 0, _Out_writes_z_(nSize))
LPWSTR lpBuffer,
_In_ DWORD nSize,
_In_opt_ va_list *Arguments
);
ÆäʵÕâ¸öº¯ÊýµÄ¹¦ÄÜÊÇͨ¹ýÓïÑÔ±êʶ·ûÀ´Ñ°ÕÒÏàÓ¦µÄÓïÑÔÎı¾È»ºó·µ»Ø¸ÃÎı¾¡£ËùÒÔÎÒÃDZØÐëÏÈ·Òë×Ö·û´®£¬È»ºó°Ñ²¢°Ñ·ÒëºÃµÄÏûÏ¢±í£¨message table£©×ÊԴǶÔÚ.exe»òÕßDLLÄ£¿éµÄÖС£
Èç¹ûÏ£Íû´©¼þÐÅÏ¢±í¿ÉÒÔʹÓÃMessage Compiler(MC.exe)¡£»òÕßÉÏÃæ´íÎó²éÕÒ¹¤¾ßµÄij¿é°´Å¥
dwFlags
ÉèÖÃһЩӰÏ캯Êý¹¤×÷µÄ±ê¼Ç¡£Ò»°ã¾ÍÊÇÏÂÃæÈý¸ö±ê¼Ç
lpSource
ÎÒÃǵÄÏûÏ¢±íµØÖ·¡£Èç¹ûʹÓÃϵͳµÄ´íÎóÂëµÄ»°ÉèÖÃΪnullptr¾ÍÐÐÁË¡£
dwMessageId
Ö¸³öÏëÒª²éÕҵĴíÎóÂëID
dwLanguageId
ʹÓÃʲôÓïÑÔÀ´ÏÔʾ.
lpBuffer
·ÒëÍêµÄ×Ö·û´®´æ´¢µÄµØ·½
nSize
Èç¹ûûÓÐÉèÖÃFORMAT_MESSAGE_ALLOCATE_BUFFERÖµ¾Í»á·µ»ØÐèÒª»º³åÇøµÄ´óС£¨ºÍ×Ö·û´®´¦Àíº¯ÊýÒ»Ñù£©¡£Èç¹ûÉèÖÃÁ˾ͻ᷵»ØÆäÖÐ×Ö·ûµÄ¶àÉÙ¸ö¡£
Arguments
Ϊռλ·ûÌṩÐÅÏ¢
ÏÂÃæÊÇÎÒ´ÓmsdnÉϰÎÏÂÀ´µÄÒ»¸öÀý×Ó
#include#include 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Èà³ÉÒ»¸öÊý£¬Õâ¸öÊý¾ÍÊÇ0±íʾʹÓÃϵͳĬÈϵÄÓïÑÔ 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) / sizeof(TCHAR), 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")); }
µ±ÎÒÃÇÏëʹÓÃ×Ô¼ºµÄ´íÎóÂëʱ¿ÉÒÔʹÓÃSetLastErrorº¯ÊýÀ´ÉèÖôíÎóÂë¡£µ«ÊÇÇë×ñÊØÏÂÃæµÄ¹æ¶¨
´íÎó´úÂëµÄ²»Í¬×Ö¶Îλ£º
´íÎó´úÂëµÄ²»Í¬×Ö¶Îλ£º |
31–30
|
29
|
28
|
27–16
|
15–0
|
ÄÚÈÝ
|
ÑÏÖØÐÔ
|
Microsoft/
¿Í»§ |
±£Áô
|
Facility
´úÂë |
Òì³£´úÂë
|
º¬Òå |
0 =
³É¹¦ 1 =
ÐÅÏ¢(Ìáʾ) 2 =
¾¯¸æ 3 =
´íÎó |
0 = Microsoft
¶¨ÒåµÄ´úÂë 1 =
¿Í»§¶¨ÒåµÄ´úÂë |
±ØÐëΪ 0 |
ǰ 256¸öÖµÓÉMicrosoft±£Áô |
Microsoft/
¿Í»§¶¨ÒåµÄ´úÂë |