如何在UASM中无需定义即可使用WinAPI的CONSOLE_CURSOR_INFO结构体
解决方案
一、无需手动定义CONSOLE_CURSOR_INFO结构体的方法
包含系统头文件
UASM兼容MASM语法,直接包含Windows SDK提供的汇编头文件即可自动获取CONSOLE_CURSOR_INFO的定义。在代码开头添加:include windows.inc include wincon.inc(注:
windows.inc通常会间接包含wincon.inc,若已包含前者可省略后者)若无法包含头文件,用
EXTERNDEF声明结构体类型
如果因环境限制不能包含头文件,可通过EXTERNDEF声明结构体类型,并配套定义成员(本质和手动声明一致,但符合MASM的外部类型规范):EXTERNDEF CONSOLE_CURSOR_INFO : STRUCT CONSOLE_CURSOR_INFO STRUCT dwSize DWORD ? bVisible BYTE ? CONSOLE_CURSOR_INFO ENDS后续就能直接使用
CONSOLE_CURSOR_INFO作为类型声明变量或常量。
你之前出现的MyCursorD语法错误,大概率是未先定义CONSOLE_CURSOR_INFO类型就直接声明变量,或是EXTERNDEF语法错误(比如错误声明变量而非类型)。确保先完成结构体类型的定义/声明,再操作变量或常量。
二、在.CONST段直接使用结构体常量
完全可以直接在.CONST段定义只读的CONSOLE_CURSOR_INFO常量,无需在.DATA段创建可写变量,前提是这个结构体仅作为输入参数使用(比如调用SetConsoleCursorInfo设置光标属性)。
示例代码:
.CONST ; 定义光标常量:大小100,可见 CursorSettings CONSOLE_CURSOR_INFO <100, TRUE> .CODE main PROC invoke GetStdHandle, STD_OUTPUT_HANDLE invoke SetConsoleCursorInfo, rax, addr CursorSettings ; 后续代码 main ENDP END main
注意:如果需要调用像GetConsoleCursorInfo这类会写入结构体的API,必须使用.DATA或.DATA?段的可写变量,因为.CONST段是只读的,写入会触发访问错误。
内容的提问来源于stack exchange,提问作者Danny Cohen
相关产品推荐
相关产品推荐

