函數 ReadConsole 爲讀取文本輸入並將其送入緩衝區提供了便捷的方法。其原型如下所示:
ReadConsole PROTO, hConsoleInput: HANDLE z ;輸入句柄 lpBuffer:PTR BYTE, ;緩衝區指針 nNumberOfCharsToRead:DWORD, ;讀取的字符數 lpNumberOfCharsRead:PTR DWORD, ;指向讀取字節數的指針 lpReserved:DWORD ;未使用
hConsoleInput 是函數 GetStdHandle 返回的可用控制檯輸入句柄。參數 lpBuffer 是字符數組的偏移量。nNumberOfCharsToRead 是一個 32 位整數,指明讀取的最大字符數。lpNumberOfCharsRead 是一個允許函數填充的雙字指針,當函數返回時,字符數的計數值將被放入緩衝區。最後一個參數未使用,因此傳遞的值爲 0。
在調用 ReadConsole 時,輸入緩衝區還要包含兩個額外的字節用來保存行結束字符。如果希望輸入緩衝區裏是空字節結束字符串,則用空字節來代替內容爲 ODh 的字節。Irvine32.lib 的過程 ReadString 就是這樣操作的。
注意:Win32 API 函數不會保存 EAX、EBX、ECX 和 EDX 寄存器。
【示例】要讀取用戶輸入的字符,就調用 GetStdHandle 來獲得控制檯標準輸入句柄,再使用該句柄調用 ReadConsoleo 下面的 ReadConsole 程序演示了這個方法。
提示:Win32 API 調用與 Irvine32 鏈接庫兼容,因此在調用 Win32 函數的同時還可以調用 DumpRegs
; 從控制檯讀取 (ReadConsole.asm)INCLUDE Irvine32.incBufSize = 80.databuffer BYTE BufSize DUP(?),0,0stdInHandle HANDLE ?bytesRead DWORD ?.codemain PROC ; 獲取標準輸入句柄 INVOKE GetStdHandle, STD_INPUT_HANDLE mov stdInHandle,eax ; 等待用戶輸入 INVOKE ReadConsole, stdInHandle, ADDR buffer, BufSize, ADDR bytesRead, 0 ; 顯示緩衝區 mov esi,OFFSET buffer mov ecx,bytesRead mov ebx,TYPE buffer call DumpMem exitmain ENDPEND main
如果用戶輸入 “abcdefg”,程序將生成如下輸出。緩衝區會插入 9 個字節:“abcdefg” 再加上 ODh 和 OAh,即用戶按下 Enter 鍵時產生的行結束字符。bytesRead 等於 9: