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

    本节将为大家讲解如何直接调用 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, WriteConsole
    INCLUDE Irvine32.inc
    
    .data
    endl 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.", endl
    messageSize DWORD ($-message)
    
    consoleHandle HANDLE 0     ; 标准输出设备句柄
    bytesWritten  DWORD ?      ; 输出字节数
    
    .code
    main PROC
      ; 获得控制台输出句柄
        INVOKE GetStdHandle, STD_OUTPUT_HANDLE
        mov consoleHandle,eax
    
      ; 向控制台写一个字符串
        INVOKE WriteConsole,
          consoleHandle,          ; 控制台输出句柄
          ADDR message,           ; 字符串指针
          messageSize,            ; 字符长度
          ADDR bytesWritten,      ; 返回输出字节数
          0                       ; 未使用
    
        INVOKE ExitProcess,0
    main ENDP
    END main

    程序生成输出如下所示:

更多...

加载中...