powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как организовать чтение строк из консольного приложения
15 сообщений из 15, страница 1 из 1
Как организовать чтение строк из консольного приложения
    #37403071
Моделятор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ккиньте пожалуйста код=) там уж сам постараюсь разобраться
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37403115
majestic-mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Моделятор,

Это консольное приложение ты сам запускаешь? или оно запускается сторонним процессом?
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37403133
Моделятор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
запускаю сам.
ну короче запускаю я unrar.exe чтобы распоковать rar архив.
и мне нужно отобразить в моей программе ход извлечения который показывается в консоли.
саму консоль скрою чтобы её небыло видно)
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37403373
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37404300
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое простое конечно

Код: plaintext
proga.exe >  1 .txt

и читать этот файл 1.txt

Но если охота помучиться, то

Чтение результатов работы консольного приложения (VB6)

Чтение результатов работы "упрямого" консольного приложения (С++)

Давно это было. Но помнится какие-то "заумные" коды я там намутил.
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37423412
Моделятор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77Самое простое конечно

Код: plaintext
proga.exe >  1 .txt

и читать этот файл 1.txt

Но если охота помучиться, то

Чтение результатов работы консольного приложения (VB6)

Чтение результатов работы "упрямого" консольного приложения (С++)

Давно это было. Но помнится какие-то "заумные" коды я там намутил.


можно по подробнее с первым случаем. а то смотрел исходники там у некоторых приложений не может читать консоль. текста не показывает зито хорошо проц грузит.упрямое наверное какоето приложение
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37423491
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моделятор,

Какие тут могут быть подробности.
Команда дос, перенаправление всего что приложение валит в консоль в текстовой файл с именем 1.txt
Потом этот файл читаете любым известным вам способом (можно непрерывно в режиме read, если конс. приложение хорошее, а не как мне тогда досталось).
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37423508
Моделятор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,

всё понятно. не пойдёт то же самое что и со вторым случаем. дело в том что там в программе както всё устроено... это консольный антивирусник. он пока всё не просканирует не сохраняет текст консоли в файл...придётся чтото другое думать....(
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37425544
Моделятор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
друзья а можно ли какнить из памяти считать текст консоли??=)
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37425811
majestic-mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Моделятор,

Всё равно придётся до уровня Win API спускаться... возможно поможет:

BOOL ReadConsoleOutput(
HANDLE hConsoleOutput,
PCHAR_INFO lpBuffer,
COORD dwBufferSize,
COORD dwBufferCoord,
PSMALL_RECT lpReadRegion
);
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37426510
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если программа, которая пишет в консоль, не освобождает ресурс (не делает Release), то никак ты её вывод не получишь.
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37429754
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneесли программа, которая пишет в консоль, не освобождает ресурс (не делает Release), то никак ты её вывод не получишь.
Там по моей ссылке с VB есть пример (ближе к концу), как "читать консоль с экрана", сделал до того как "разработчики исправили", как раз для гнусных случаев.
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37442746
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно считать консоль даже очень просто:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Option Explicit

Public Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long

Public Sub Main()
    Dim oExec As Object, s As String, ss As String

    s = CreateObject("WScript.Shell").Exec("C:\Program Files\WinRAR\UnRAR.exe").StdOut.ReadAll
    ss = s
    OemToChar s, ss

    Debug.Print ss
End Sub

Но если хочется чтобы не мелькало консольное окно, то лучше перехватывать StdOut запуская консольное приложение через CreateProcess - там можно указать что консольное окно создавать не нужно...
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37442748
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще чуть упростил:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Option Explicit

Public Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long

Public Sub Main()
    Dim oExec As Object, s As String

    s = CreateObject("WScript.Shell").Exec("C:\Program Files\WinRAR\UnRAR.exe").StdOut.ReadAll
    OemToChar s, s

    Debug.Print s
End Sub
...
Рейтинг: 0 / 0
Как организовать чтение строк из консольного приложения
    #37601236
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот читал читал и зашел в такой лес, что нафиг мне не нужно было туда смотреть...
Консольное приложения. Что нужно ? Уметь читать и посылать данные. Но простая консоль без приложения тоже никому не нужна, разве что для пантов. Чесно, я так и ничего толкового не нашел. А в одном из примеров увидел что простая команда shell к примеру "cmd" вызовет программку cmd в только что созданной консоли. Для меня это уже как нюанс. Откуда я такое мог догадаться. Могло и в новом окне открыться. В итоге открывается этот же cmd в консоле и теперь можно свободно подавать команды и считывать ответы. Ну и как пример рабочего кода самый из простых подошел вот этот

Код: 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.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
Option Explicit

Private Declare Function AllocConsole Lib "kernel32" () As Long
Private Declare Function FreeConsole Lib "kernel32" () As Long
Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Private Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" (ByVal hConsoleOutput As Long, _
  ByVal lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, _
  lpReserved As Any) As Long
  
Private Declare Function SetConsoleMode Lib "kernel32" (ByVal hConsoleOutput As Long, _
  dwMode As Long) As Long

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


Private Const STD_INPUT_HANDLE = -10&
Private Const STD_OUTPUT_HANDLE = -11&
Private Const STD_ERROR_HANDLE = -12&

Private Const ENABLE_LINE_INPUT = &H2
Private Const ENABLE_ECHO_INPUT = &H4
Private Const ENABLE_MOUSE_INPUT = &H10
Private Const ENABLE_PROCESSED_INPUT = &H1
Private Const ENABLE_WINDOW_INPUT = &H8

Private Const ENABLE_PROCESSED_OUTPUT = &H1
Private Const ENABLE_WRAP_AT_EOL_OUTPUT = &H2

Private Sub Main()
Dim sOutPut As String
Dim lHInput As Long, lHOutPut As Long, lHErr As Long
Dim sInput As String * 255

'Create an instance of the console
AllocConsole

'Get handle to STD_INPUT, STD_OUTPUT, STD_ERROR
lHInput = GetStdHandle(STD_INPUT_HANDLE)
lHOutPut = GetStdHandle(STD_OUTPUT_HANDLE)
lHErr = GetStdHandle(STD_ERROR_HANDLE)

'Allow Input
SetConsoleMode lHInput, ENABLE_ECHO_INPUT


'Write output
sOutPut = "Enter a number between 1 and 10." & vbCrLf
WriteConsole lHOutPut, sOutPut, Len(sOutPut), vbNull, vbNull

'Read Input
ReadConsole lHInput, sInput, Len(sInput), vbNull, vbNull
sInput = TrimWithoutPrejudice(sInput)

If IsNumeric(sInput) Then
    If CLng(sInput) < 1 Or CLng(sInput) > 10 Then
        sOutPut = "You did not follow the instructions"
    Else
        sOutPut = "You entered " & sInput
    End If
Else
    sOutPut = "You did not follow the instructions"
End If

sOutPut = sOutPut & vbCrLf
WriteConsole lHOutPut, sOutPut, Len(sOutPut), vbNull, vbNull

 
sOutPut = "Press Enter to exit" & vbCrLf
WriteConsole lHOutPut, sOutPut, Len(sOutPut), vbNull, vbNull
ReadConsole lHInput, sInput, Len(sInput), vbNull, vbNull
sInput = TrimWithoutPrejudice(sInput)

'Finished
FreeConsole
End Sub

Public Function TrimWithoutPrejudice(ByVal InputString As String) As String
'http://www.freevbcode.com/ShowCode.ASP?ID=104

Dim sAns As String
Dim sWkg As String
Dim sChar As String
Dim lLen As Long
Dim lCtr As Long

sAns = InputString
lLen = Len(InputString)

If lLen > 0 Then
'Ltrim
    For lCtr = 1 To lLen
        sChar = Mid(sAns, lCtr, 1)
        If Asc(sChar) > 32 Then Exit For
    Next

sAns = Mid(sAns, lCtr)
lLen = Len(sAns)

'Rtrim
    If lLen > 0 Then
        For lCtr = lLen To 1 Step -1
            sChar = Mid(sAns, lCtr, 1)
            If Asc(sChar) > 32 Then Exit For
        Next
    End If
    sAns = Left$(sAns, lCtr)
End If

TrimWithoutPrejudice = sAns

End Function




а теперь я просто вставил туда команду shell "cmd" и все заработало

Код: 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.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
Option Explicit

Private Declare Function AllocConsole Lib "kernel32" () As Long
Private Declare Function FreeConsole Lib "kernel32" () As Long
Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Private Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" (ByVal hConsoleOutput As Long, _
  ByVal lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, _
  lpReserved As Any) As Long
  
Private Declare Function SetConsoleMode Lib "kernel32" (ByVal hConsoleOutput As Long, _
  dwMode As Long) As Long

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


Private Const STD_INPUT_HANDLE = -10&
Private Const STD_OUTPUT_HANDLE = -11&
Private Const STD_ERROR_HANDLE = -12&

Private Const ENABLE_LINE_INPUT = &H2
Private Const ENABLE_ECHO_INPUT = &H4
Private Const ENABLE_MOUSE_INPUT = &H10
Private Const ENABLE_PROCESSED_INPUT = &H1
Private Const ENABLE_WINDOW_INPUT = &H8

Private Const ENABLE_PROCESSED_OUTPUT = &H1
Private Const ENABLE_WRAP_AT_EOL_OUTPUT = &H2

Private Sub Main()
Dim sOutPut As String
Dim lHInput As Long, lHOutPut As Long, lHErr As Long
Dim sInput As String * 255

'Create an instance of the console
AllocConsole
Shell "cmd"
'Get handle to STD_INPUT, STD_OUTPUT, STD_ERROR
lHInput = GetStdHandle(STD_INPUT_HANDLE)
lHOutPut = GetStdHandle(STD_OUTPUT_HANDLE)
lHErr = GetStdHandle(STD_ERROR_HANDLE)

'Allow Input
SetConsoleMode lHInput, ENABLE_ECHO_INPUT


'Write output
sOutPut = "Enter a number between 1 and 10." & vbCrLf
WriteConsole lHOutPut, sOutPut, Len(sOutPut), vbNull, vbNull

'Read Input
ReadConsole lHInput, sInput, Len(sInput), vbNull, vbNull
sInput = TrimWithoutPrejudice(sInput)

If IsNumeric(sInput) Then
    If CLng(sInput) < 1 Or CLng(sInput) > 10 Then
        sOutPut = "You did not follow the instructions"
    Else
        sOutPut = "You entered " & sInput
    End If
Else
    sOutPut = "You did not follow the instructions"
End If

sOutPut = sOutPut & vbCrLf
WriteConsole lHOutPut, sOutPut, Len(sOutPut), vbNull, vbNull

 
sOutPut = "Press Enter to exit" & vbCrLf
WriteConsole lHOutPut, sOutPut, Len(sOutPut), vbNull, vbNull
ReadConsole lHInput, sInput, Len(sInput), vbNull, vbNull
sInput = TrimWithoutPrejudice(sInput)

'Finished
FreeConsole
End Sub

Public Function TrimWithoutPrejudice(ByVal InputString As String) As String
'http://www.freevbcode.com/ShowCode.ASP?ID=104

Dim sAns As String
Dim sWkg As String
Dim sChar As String
Dim lLen As Long
Dim lCtr As Long

sAns = InputString
lLen = Len(InputString)

If lLen > 0 Then
'Ltrim
    For lCtr = 1 To lLen
        sChar = Mid(sAns, lCtr, 1)
        If Asc(sChar) > 32 Then Exit For
    Next

sAns = Mid(sAns, lCtr)
lLen = Len(sAns)

'Rtrim
    If lLen > 0 Then
        For lCtr = lLen To 1 Step -1
            sChar = Mid(sAns, lCtr, 1)
            If Asc(sChar) > 32 Then Exit For
        Next
    End If
    sAns = Left$(sAns, lCtr)
End If

TrimWithoutPrejudice = sAns

End Function




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


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