2025年4月3日 星期四 乙巳(蛇)年 正月初四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 汇编

汇编语言GetLastError和FormatMessage函数:获取错误信息

时间:03-05来源:作者:点击数:91

若 Windows API 函数返回了错误值 ( 如 NULL),则可以调用 API 函数 GetLastError 来获取该错误的更多信息。该函数用 EAX 返回 32 位整数错误码:

.data
messageId DWORD ?
.code
call GetLastError
mov messageId,eax

MS-Windows 有大量的错误码,因此,程序员可能希望得到一个消息字符串来对错误进行说明。要想达到这个目的,就调用函数 FormatMessage:

FormatMessage PROTO,         ;格式化消息
    dwFlags:DWORD,                ;格式化选项
    lpSource:DWORD,               ;消息定义的位置
    dwMsgID:DWORD,              ;消息标识符
    dwLanguageID:DWORD,     ;语言标识符
    lpBuffer:PTR BYTE,               ;缓冲区接收字符串指针
    nSize:DWORD,                     ;缓冲区大小
    va_list: DWORD                   ;参数列表指针

该函数的参数有点复杂,程序员需要阅读 SDK 文档来了解全部信息。下面简要列出了最常用的参数值。除了 lpBuffer 是输出参数外,其他都是输入参数:

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
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门