Четверг, 21.11.2024, 15:27
Приветствую Вас Гость | RSSГлавная | Регистрация | Вход
Меню сайта
Категории раздела
Субклассирование элементов управления [3]
Приёмы субклассирования различных элементов управления для расширения их функциональных возможностей.
Вспомогательные функции [4]
Полезные советы, которые могут пригодиться во всех областях программирования
Мультимедиа [2]
Советы по работе над различными мультимедийными приложениями.
Необычные приложения [1]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Программирование на Visual Basic » Необычные приложения

Консольное приложение на VB6

Можно ли создать в среде 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 'Main

Запустите проект на выполнение, предварительно сохранив его. Вы увидите консоль с надписью "Hello, world!" Зрелище для VB6 - программистов весьма непривычное. Будет работать этот код и из среды VBA. Вы можете даже набрать в консоли какой-нибудь текст, а если нажать клавишу Enter, консоль закроется.

Надо упомянуть, что программная запись в консоль возможна только латинскими буквами. Для преобразования русских строк в OEM-формат, с которым работает консоль и обратно, используются различные функции вроде CharToOem, OemToChar и т. п., вызов которых не так прост из-за различия в том, как хранятся в памяти строки в языках VB и С, на котором написана OC Windows.

Я не случайно упомянул вначале, что создать консольную программу на VB6 можно теоретически. Для того, чтобы написать настоящую консольную программу, необходимо знать большое количество API-функций, связанных с консолью. Вызов их из среды VB6 иногда чудовищно сложен по указанным выше причинам1. Поэтому эта задача по плечу лишь большим фанатикам языка VB6, любителям крепких орешков. Таким образом, здесь лучше пользоваться языком С, С++, или писать консольные программы на VB .NET.

1 А также, например, из-за того, что в языке VB не поддерживаются объединения (Union), которые в консольных функциях используются сплошь и рядом. Приходится прибегать к различного рода ухищрениям, существенно раздувающим код программы.

Автор - Цзяофань

Категория: Необычные приложения | Добавил: Xiaofang (11.06.2009)
Просмотров: 9714 | Рейтинг: 5.0/1 |
Всего комментариев: 0
Форма входа
Поиск
Друзья сайта
Антология советской песни
Сайт управляется системой uCoz