首页 > 汇编语言 > 汇编语言MS-Windows编程
阅读:1,475
汇编语言GetLastError和FormatMessage函数:获取错误信息
若 Windows API 函数返回了错误值 ( 如 NULL),则可以调用 API 函数 GetLastError 来获取该错误的更多信息。该函数用 EAX 返回 32 位整数错误码:
FormatMessage 的示例调用如下:
.data
messageId DWORD ?
.code
call GetLastError
mov messageId,eax
FormatMessage PROTO, ;格式化消息
dwFlags:DWORD, ;格式化选项
lpSource:DWORD, ;消息定义的位置
dwMsgID:DWORD, ;消息标识符
dwLanguageID:DWORD, ;语言标识符
lpBuffer:PTR BYTE, ;缓冲区接收字符串指针
nSize:DWORD, ;缓冲区大小
va_list: DWORD ;参数列表指针
1) dwFlags
保存格式化选项的双字整数,包括如何解释参数 lpSource。它规定怎样处理换行,以及格式化输出行的最大宽度。建议值为 FORMAT_MESSAGE_ALLOCATE_BUFFER 和 FORMAT_MESSAGE_FROM_SYSTEM。2) lpSource
消息定义位置的指针。若按照建议值设置 dwFlags,则 lpSource 设置为 NULL(0)。3) dwMsgID
调用 GetLastError 后返回的双字整数。4) dwLanguageID
语言标识符。若将其设置为 0,则消息为语言无关,否则将对应于用户的默认语言环境。5) lpBuffer( 输出参数 )
接收空字节结束消息字符串的缓冲区指针。如果使用了 FORMAT_MESSAGE_ALLOCATE_BUFFER 选项,则会自动分配缓冲区。6) nSize
用于指定一个缓冲区来保存消息字符串。如果 dwFlags 使用了上述建议选项,则该参数可以设置为 0。7) va_list
数组指针,该数组包含了可以插入到格式化消息的值。由于没有格式化错误消息,这个参数可以为 NULL(0)。FormatMessage 的示例调用如下:
.data messageId DWORD ? pErrorMsg DWORD ? ;指向错误消息 .code call GetLastError mov messageId,eax INVOKE FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER + \ FORMAT_MESSAGE_FROM_SYSTEM, NULL, messagelD, 0, ADDR pErrorMsg, 0, NULL调用 FormatMessage 后,再调用 LocalFree 来释放由 FormatMessage 分配的存储空间:
INVOKE LocalFree, pErrorMsg
WriteWindowsMsg
Irvine32 链接库有如下 WriteWindowsMsg 程,它封装了消息处理的细节:;---------------------------------------------------- WriteWindowsMsg PROC USES eax edx ; ; 显示包含 MS-Windows 最新生成的错误字符串 ; 接收: 无 ; 返回: 无 ;---------------------------------------------------- .data WriteWindowsMsg_1 BYTE "Error ",0 WriteWindowsMsg_2 BYTE ": ",0 pErrorMsg DWORD ? ; 指向错误消息 messageId DWORD ? .code call GetLastError mov messageId,eax ; 显示错误号 mov edx,OFFSET WriteWindowsMsg_1 call WriteString call WriteDec ; show error number mov edx,OFFSET WriteWindowsMsg_2 call WriteString ; 获取相应的消息字符串 INVOKE FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER + \ FORMAT_MESSAGE_FROM_SYSTEM, NULL, messageID, NULL, ADDR pErrorMsg, NULL, NULL ; 显示 MS-Windows 生成的错误消息 mov edx,pErrorMsg call WriteString ; 释放错误消息字符串的空间 INVOKE LocalFree, pErrorMsg ret WriteWindowsMsg ENDP