用VB建立字符界面的控制臺程序

字號:

即使是初學(xué)VB的人,對于如何用它來建立一個GUI界面的標(biāo)準(zhǔn)Windows應(yīng)用程序,肯定也是胸有成竹;然而,對于如何用VB來編寫字符界面的控制臺程序(Console-Mode Applications),知道的人恐怕不多。有人甚至認(rèn)為這是不可能的,因為VB對編寫控制臺程序并無內(nèi)在的支持,在VB的“新建工程”對話框里沒有“控制臺程序”這一選項。實際上,利用Windows提供的應(yīng)用程序編程接口(API),VB是能夠建立控制臺程序的??刂婆_程序與圖形界面的標(biāo)準(zhǔn)Windows程序不同,它沒有Windows程序所通行的窗口,其與用戶的交互是基于字符界面,外觀類似于“MS-DOS方式”,同標(biāo)準(zhǔn)的Windows程序相比,控制臺程序具有界面簡單、占內(nèi)存少、生成的可執(zhí)行文件小的優(yōu)點,因而在某些場合還有用武之地。
    由于VB對建立控制臺程序并無內(nèi)在支持,全部工作都是依靠調(diào)用API函數(shù)來完成,故首先要用VB建立一個新的“標(biāo)準(zhǔn)EXE”工程,并刪除其默認(rèn)窗體(Form1),添加一標(biāo)準(zhǔn)模塊(Module1),將其改名為VBConsole.bas,后續(xù)的所有工作都是在此模塊中完成的。
    下面按功能分類逐一介紹本文用到的API函數(shù)。
    1.創(chuàng)建和銷毀控制臺窗口(consol window)用VB創(chuàng)建控制臺程序的第一步就是為VB程序創(chuàng)建一個console window,并在程序結(jié)束時銷毀它。這分別用到AllocConsole和FreeConsole函數(shù)。
    Private Declare Function AllocConsole Lib "kernel32"() As Long
    功能:為VB程序創(chuàng)建一個 console window。
    Private Declare Function FreeConsole Lib "kernel32"() AS Long
    功能:銷毀為VB程序創(chuàng)建的 console window。
    2.取得所建立的 console window 的句柄(Handle)
    DOS程序有三個標(biāo)準(zhǔn)文件:標(biāo)準(zhǔn)輸入文件(stdin),標(biāo)準(zhǔn)輸出文件(stdout),標(biāo)準(zhǔn)錯誤文件(siderr)。與此類似,控制臺程序窗口有三個句柄:
    輸入句柄(input handle) — 指向控制臺程序的輸入緩沖區(qū)
    輸出句柄(output handle)、錯誤句柄(error handle)— 指向控制臺程序的屏幕輸出緩沖區(qū)
    在能夠進(jìn)行輸入/輸出操作之前,必須用 GetstdHandle 函數(shù)取得 console window 的這三個句柄。
    Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
    功能:返回 console window 的三個句柄之一。
    說明:參數(shù)nStdHandle決定此函數(shù)返回的是哪一個句柄,它可以取如下值之一:
    Private Const STD_INPUT_HANDLE = -10&   ''返回 input handle
    Private Const TD_OUTPUT_HANDLE = - 11&  ''返回 output handle
    Private Const STD_ERROR_HANDLE = -12&   ''返回 error handle
    3.控制臺輸入/輸出創(chuàng)建了
    console window 并獲得其 input/output handle 后,就可以利用WriteConsole和ReadConsole進(jìn)行輸入/輸出了。
    Private Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" _
    (ByVal hConsoleoutput As Long,ByVal lPBuffer As Any, ByVal nNumberofCharsTowrite _
    As Long, IpNumberofCharsWritten As Long, lpReserved As Any) As Long
    功能:向控制臺窗口輸出字符串。
    說明:hConsoleOutput—控制臺的outputhandle。
    lpBuffer—要輸出的字符串。
    nNumberOfCharsToWrite—要輸出的字符串的長度。
    lpNumberofCharsWritten—實際輸出的字符串的長度,可置為vbNull。
    lpReserved—保留,必須置為vbNul。
    Private Declare Function ReadConsole Lib "kernel32" Alias "ReadConsoleA" _
    (ByVal hConsoleInput As Long, ByVal lpBuffer As String, ByVal nNumberofCharsToRead _
    As Long,lpNumberofCharsRead As Long, lpReserved As Any) As Long