Можно ли создать в среде VB6 консольное приложение? Да, теоретически можно, и я вам сейчас это продемонстрирую.
Создайте новый проект типа Standard EXE. Удалите из проекта форму, и добавте стандартный модуль. В свойствах проекта установите стартовый объект (Startup Object) - Sub Main.
Одним из способов создания консоли является вызов API-функции AllocConsole. Парой с ней ходит функция FreeConsole, которая используется для освобождения памяти при выходе из программы. Объявляются они очень просто:
Declare Function AllocConsole Lib "kernel32" () As Long
Declare Function FreeConsole Lib "kernel32" () As Long
Для работы с консолью необходимо получить дескрипторы консоли (для чтения и записи они раздельны). Это делается с помощью функции GetStdHandle, при этом в качестве аргумента нужно передавать константы соответственно STD_INPUT_HANDLE и STD_OUTPUT_HANDLE (есть ещё STD_ERROR_HANDLE для вывода сообщений об ошибках):
Const STD_INPUT_HANDLE = -10&
Const STD_OUTPUT_HANDLE = -11&
Declare Function GetStdHandle Lib "kernel32" ( _
ByVal nStdHandle As Long) As Long
Для чтения и записи в консольных приложениях применяются функции ReadConsole и WriteConsole:
Declare Function WriteConsole Lib "kernel32" _
Alias "WriteConsoleA" (ByVal hConsoleOutput As Long, _
lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, _
lpNumberOfCharsWritten As Long, lpReserved As Any) As Long
Declare Function ReadConsole Lib "kernel32" _
Alias "ReadConsoleA" (ByVal hConsoleInput As Long, _
lpBuffer As Any, ByVal nNumberOfCharsToRead As Long, _
lpNumberOfCharsRead As Long, lpReserved As Any) As Long
Все эти объявления поместите в секцию Declarations модуля. Ниже напишем процедуру Main.
Sub Main()
Dim hOutput As Long, hInput As Long
Dim cWritten As Long, cRead As Long
Dim strHello As String, bRead As Byte
AllocConsole
hOutput = GetStdHandle(STD_OUTPUT_HANDLE)
hInput = GetStdHandle(STD_INPUT_HANDLE)
strHello = "Hello, world!" & vbCrLf & _
"Press <Enter> to close." & vbCrLf
WriteConsole hOutput, ByVal strHello, _
Len(strHello), cWritten, 0
ReadConsole hInput, bRead, 1, cRead, 0
FreeConsole
End Sub
Запустите проект на выполнение, предварительно сохранив его. Вы увидите консоль с надписью "Hello, world!" Зрелище для VB6 - программистов весьма непривычное. Будет работать этот код и из среды VBA. Вы можете даже набрать в консоли какой-нибудь текст, а если нажать клавишу Enter, консоль закроется.
Надо упомянуть, что программная запись в консоль возможна только латинскими буквами. Для преобразования русских строк в OEM-формат, с которым работает консоль и обратно, используются различные функции вроде CharToOem, OemToChar и т. п., вызов которых не так прост из-за различия в том, как хранятся в памяти строки в языках VB и С, на котором написана OC Windows.
Я не случайно упомянул вначале, что создать консольную программу на VB6 можно теоретически. Для того, чтобы написать настоящую консольную программу, необходимо знать большое количество API-функций, связанных с консолью. Вызов их из среды VB6 иногда чудовищно сложен по указанным выше причинам1. Поэтому эта задача по плечу лишь большим фанатикам языка VB6, любителям крепких орешков. Таким образом, здесь лучше пользоваться языком С, С++, или писать консольные программы на VB .NET.
1 А также, например, из-за того, что в языке VB не поддерживаются объединения (Union), которые в консольных функциях используются сплошь и рядом. Приходится прибегать к различного рода ухищрениям, существенно раздувающим код программы.
Автор - Цзяофань
|