Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как организовать чтение строк из консольного приложения / 15 сообщений из 15, страница 1 из 1
19.08.2011, 11:25
    #37403071
Моделятор
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать чтение строк из консольного приложения
ккиньте пожалуйста код=) там уж сам постараюсь разобраться
...
Рейтинг: 0 / 0
19.08.2011, 11:36
    #37403115
majestic-mike
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать чтение строк из консольного приложения
Моделятор,

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

BOOL ReadConsoleOutput(
HANDLE hConsoleOutput,
PCHAR_INFO lpBuffer,
COORD dwBufferSize,
COORD dwBufferCoord,
PSMALL_RECT lpReadRegion
);
...
Рейтинг: 0 / 0
06.09.2011, 10:57
    #37426510
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать чтение строк из консольного приложения
если программа, которая пишет в консоль, не освобождает ресурс (не делает Release), то никак ты её вывод не получишь.
...
Рейтинг: 0 / 0
07.09.2011, 19:47
    #37429754
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать чтение строк из консольного приложения
Konst_Oneесли программа, которая пишет в консоль, не освобождает ресурс (не делает Release), то никак ты её вывод не получишь.
Там по моей ссылке с VB есть пример (ближе к концу), как "читать консоль с экрана", сделал до того как "разработчики исправили", как раз для гнусных случаев.
...
Рейтинг: 0 / 0
16.09.2011, 00:59
    #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
16.09.2011, 01:07
    #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
01.01.2012, 20:12
    #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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как организовать чтение строк из консольного приложения / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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