汇编语言WriteConsole和WriteConsoleOutputCharacter函数:控制台

01/04 09:06
阅读数 40

本节将为大家讲解如何直接调用 Win32 函数在控制台输出,如 WriteConsole 和 WriteConsoleOutputCharacter。直接调用要求了解更多细节,但是它也提供了比 Irvine32 链接库过程更大的灵活性。

数据结构

有些 Win32 控制台函数使用的是预定义的数据结构,包括 COORD 和 SMALL_RECT。COORD 结构包含的是控制台屏幕缓冲区内字符单元格的坐标。坐标原点(0, 0)位于左上角单元格:

COORD STRUCT    X WORD ?    Y WORD ?COORD ENDS

SMALL_RECT 结构包含的是矩形的左上角和右下角,它指定控制台窗口中的屏幕缓冲区字符单元格区域:

SMALL_RECT STRUCT    Left WORD ?    Top WORD ?    Right WORD ?    Bottom WORD ?SMALL_RECT ENDS

WriteConsole 函数

函数 WriteConsole 在控制台窗口的当前光标所在位置写一个字符串,并将光标留着字符串末尾右边的字符位置上。它按照标准 ASCII 控制字符操作,比如制表符、回车和换行。

字符串不一定以空字节结束。函数原型如下:


WriteConsole PROTO,    hConsoleOutput:HANDLE,    lpBuffer:PTR BYTE,    nNumberOfCharsToWrite:DWORD,    lpNumberOfCharsWritten:PTR DWORD,    lpReserved:DWORD

hConsoleOutput 是控制台输出流句柄;lpBuffer 是输出字符数组的指针;nNumberOfCharsToWrite 是数组长度;lpNumberOfCharsWritten 是函数返回时实际输出字符数量的整数指针。最后一个参数未使用,因此将其设置为 0。

示例程序:Console1

下面的程序通过向控制台窗口写字符串演示了函数 GetStdHandle、ExitProcess 和 WriteConsole:

; Win32 控制台示例 #1    (Consolel.asm); 本程序调用如下 Win32 控制台函数:; GetStdHandle, ExitProcess, WriteConsoleINCLUDE Irvine32.inc.dataendl EQU <0dh,0ah>            ; 行结尾message LABEL BYTE    BYTE "This program is a simple demonstration of "    BYTE "console mode output, using the GetStdHandle "    BYTE "and WriteConsole functions.", endlmessageSize DWORD ($-message)consoleHandle HANDLE 0     ; 标准输出设备句柄bytesWritten  DWORD ?      ; 输出字节数.codemain PROC  ; 获得控制台输出句柄    INVOKE GetStdHandle, STD_OUTPUT_HANDLE    mov consoleHandle,eax  ; 向控制台写一个字符串    INVOKE WriteConsole,      consoleHandle,          ; 控制台输出句柄      ADDR message,           ; 字符串指针      messageSize,            ; 字符长度      ADDR bytesWritten,      ; 返回输出字节数      0                       ; 未使用    INVOKE ExitProcess,0main ENDPEND main

程序生成输出如下所示:


图片

WriteConsoleOutputCharacter 函数

函数 WriteConsoleOutputCharacter 从指定位置开始,向控制台屏幕缓冲区的连续单元格内复制一组字符。原型如下:

WriteConsoleOutputCharacter PROTO,    hConsoleOutput:HANDLE,                         ;控制台输出句柄    lpCharacter :PTR BYTE,                               ;缓冲区指针    nLength: DWORD,                                      ;缓冲区大小    dwWriteCoord: COORD,                             ;第一个单元格的坐标    lpNumberOfCharsWritten: PTR DWORD   ;输出计数器

如果文本长度超过了一行,字符就会输岀到下一行。屏幕缓冲区的属性值不会改变。如果函数不能写字符,则返回零。ASCII 码,如制表符、回车和换行,会被忽略。


图片


展开阅读全文
asm
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部