powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Консольное приложение на VB6
8 сообщений из 8, страница 1 из 1
Консольное приложение на VB6
    #37598033
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну т.е.
1. При запуске без параметров должно выводиться описание оных в консоль
2. Ну если какого параметра не хватает, м.б. подсказка
3. Промежуточные результаты чего делает.

Можно конечно использовать MsgBox, это еще худо-бедно годится если без параметров,
но ни в какие ворота не лезет, если информация чего делает или скажем сообщение об ошибке, msgbox стопорнет программу.

Ну, и самое главное:
4. При последовательном запуске этого tool из bat-файла, все должно работать в едином потоке (одной консоли из кот. bat был запущен), т.е. следующая строчка bat-файла не должна запускаться до окончания работы проги, вызванной предыдущей строчкой.
Худо бедно это реализуется через
Код: vbnet
1.
start /w proga.exe [options]


но именно из-за большого к-ва [options], среди которых могут быть в частности
1) длинный путь к proga.exe, кот. например указан полностью
2) длинные пути в самих [options], если option=путь к файлу с путем
использование start /w экстра-усложняет необходимые махинации со всякими кавычками и т.п.

да и кстати непонятно чего там будет со start на Висте/win7 (+/- x64) (просто не пробовал)

Приложение с main() без Form по умолчанию таковым не является.
Собственно утилиту саму я уже написал, но столкнулся с вышеуказанными проблемками при ее использовании отсюда вопрос.
...
Рейтинг: 0 / 0
Консольное приложение на VB6
    #37598063
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну допустим, нарыл код, ниже.
Но в этом случае создается новая консоль.
А если я запускаю из FAR или из cmd, то я хочу чтоб использовалась тек. консоль, иначе изврат и у меня п.4 не выполнится.
Чего делать надо?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
Option Explicit

Declare Function AllocConsole Lib "kernel32" () As Long
Declare Function FreeConsole Lib "kernel32" () As Long

Const STD_INPUT_HANDLE = -10&
Const STD_OUTPUT_HANDLE = -11&

Declare Function GetStdHandle Lib "kernel32" ( _
ByVal nStdHandle As Long) As Long

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

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
...
Рейтинг: 0 / 0
Консольное приложение на VB6
    #37598108
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Консольное приложение на VB6
    #37598127
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

И-и-и, а куда именно там смотреть.
Изъян всех этих примеров в том что
If you run the application from the command prompt it will create a new console window
но гордость хлещет, типа это ж консоль
but it is truly a console window .
AllocConsole создает НОВУЮ консоль,
а мне надо УНАСЛЕДОВАТЬ консоль, из которой запускали, иначе грош цена такому "консольному приложению".
Разницу чувствуете?
По идее нужно
AttachConsole
но пример который например здесь
http://www.vbforums.com/showthread.php?t=586293
не обязательно оприходует именно тот PID из которого запускали, если например несколько far-ов запущено.
Думаю вы меня поняли.
...
Рейтинг: 0 / 0
Консольное приложение на VB6
    #37598186
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вспомнил. я находил где-то работающий код, италиец выложил исходник (не помню где). Помню что я искал такие ключевые слова в гугл "исходник rybka uci" сначало искал "rybka протокол". Шахматный движок работает через консоль, а морду, дополнительную логику и управления можно лепить на любом языке.
...
Рейтинг: 0 / 0
Консольное приложение на VB6
    #37598196
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77White Owl,

И-и-и, а куда именно там смотреть.Именно туда, куда я показал.
Дмитрий77Изъян всех этих примеров в том что
If you run the application from the command prompt it will create a new console windowНе правда. Читай внимательнее.
...
Рейтинг: 0 / 0
Консольное приложение на VB6
    #37598318
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlИменно туда, куда я показал.
Ик,
дык показывать надо было сюда
Oh... The "Secret"

One really important detail nobody talks about much is that for a compiled VB program to run as a console program, it has to be linked for the Console subsystem in Windows. Otherwise none of this will work at all.

The VB IDE doesn't support this - so the easiest option is to relink the EXE after compiling it:
LINK /EDIT /SUBSYSTEM:CONSOLE {your exe's filename}
LINK.EXE comes with VB6, probably VB5 as well. To make this easier I keep this short script around:


Код: vbnet
1.
2.
rem C:\Program Files\Microsoft Visual Studio\VB98\LINK.EXE
LINK /EDIT /SUBSYSTEM:CONSOLE %1



А я то сижу-читаю про какую-то галиматью, ActiveX-exe какой-то, Scripting.ГлюкоFileSystemObject...

Ну, тогда у меня сверху полностью рабочий (как я хочу) код, после линковки консоль НАСЛЕДУЕТСЯ.
Т.е. СПАСИБО ОГРОМНОЕ

Маленький вопрос к знатокам:
Как заменить
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
"Press <Enter> to close." & vbCrLf
 
 'пишем
 WriteConsole hOutput, ByVal strHello, _
 Len(strHello), cWritten, 0

 'эту функцию вызываем для того,
 'чтобы консоль не закрылась сразу же
 ReadConsole hInput, bRead, 1, cRead, 0



на
Код: vbnet
1.
Press any key to continue . . .


(чтоб реально так и было)
дабы уж совсем по стандарту
...
Рейтинг: 0 / 0
Консольное приложение на VB6
    #37598337
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77на
Код: vbnet
1.
Press any key to continue . . .


(чтоб реально так и было)
дабы уж совсем по стандарту

Ну, я извратился (код ниже).
Но что-то тут не так:
1) Моя Press any key to continue . . . не реагирует напр. на F3, F5 итп.
2) Моя Press any key to continue . . . не стирается после собственно continue
3) Родная Press any key to continue . . . выводится именно тогда когда видимая часть консоли полностью заполнена.

Т.е. Press any key to continue . . какая-то стадартная фича, а у меня (код ниже) изврат-подделка
Как сделать нормально?


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
Option Explicit

Declare Function AllocConsole Lib "kernel32" () As Long
Declare Function FreeConsole Lib "kernel32" () As Long

Const STD_INPUT_HANDLE = -10&
Const STD_OUTPUT_HANDLE = -11&

Declare Function GetStdHandle Lib "kernel32" ( _
ByVal nStdHandle As Long) As Long

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

Public Type PINPUT_RECORD
    Type1 As Integer
    Type2 As Integer
    Param1 As Integer
    Param2 As Integer
    Param3 As Integer
    Param4 As Integer
    Param5 As Integer
    Param6 As Integer
    Param7 As Integer
    Param8 As Integer
End Type

Public Const CON_KEY_EVENT& = &H1

Declare Function WaitForSingleObject& Lib "kernel32" (ByVal hObject As Long, _
  ByVal dwTimeout As Long)
Declare Function ReadConsoleInput% Lib "kernel32" Alias "ReadConsoleInputA" _
  (ByVal hConsoleInput As Long, pirBuffer As PINPUT_RECORD, ByVal cInRecords _
  As Long, lpcRead As Long)
  
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 any key to continue . . . "
 
 'пишем
 WriteConsole hOutput, ByVal strHello, _
 Len(strHello), cWritten, 0

 'эту функцию вызываем для того,
 'чтобы консоль не закрылась сразу же
 'ReadConsole hInput, bRead, 1, cRead, 0
 PressAnyKey hInput
 
 'освобождаем память на выходе
 FreeConsole
End Sub 'Main
Public Function PressAnyKey(the_input As Long) As String
 Dim strResult As String
    Do
        strResult = ReadChar(the_input)
        DoEvents
    Loop While strResult = ""
End Function

Public Function ReadChar(the_input As Long) As String

  Dim myEvent As PINPUT_RECORD
  Dim strReturn As String
  Dim length As Long
  
  length = 0

  If Not WaitForSingleObject(the_input, 0) Then
    ReadConsoleInput the_input, myEvent, 1, length
    If myEvent.Type1 = CON_KEY_EVENT Then
      If myEvent.Param1 Then
        If myEvent.Param6 > 0 Then 'RealKey
          strReturn = Chr(myEvent.Param6)
        End If
      End If
    End If
  End If
  
  ReadChar = strReturn

End Function


...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Консольное приложение на VB6
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]