powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Чтение результатов работы консольного приложения
25 сообщений из 42, страница 1 из 2
Чтение результатов работы консольного приложения
    #35049083
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть консольное приложение proga.exe. Смысл:через TAPI посылаем факс, в консоли наблюдаем как дела:

2008/01/09 02:44:29> DialTone
2008/01/09 02:44:29> Dialing
2008/01/09 02:44:29> Proceeding
2008/01/09 02:44:30> RingBack
2008/01/09 02:44:32> Connected
2008/01/09 02:44:50> Sending Page 1
2008/01/09 02:45:43> Sending Page 2
2008/01/09 02:46:40> Idle
> >> SUCCEEDED

Хочется:
Запустить его из VB и все эти строки(что пишет на экран) в VB и выводить в режиме REAL-TIME
Как запустить понятно
В1: shell(proga.exe) или ShellAndContinue(proga.exe)
В2: http://www.sources.ru/msdn/howto/q171654.shtml -здесь тоже уже почитал, даже воспроизвел

Есть конечно вариант: shell(proga.exe > 1.txt)
Но в этом случае 1.txt мы получим только в 02:46:40 (до этого там будет пусто), т.е. по окончании работы программы, а надо уже в 02:44:29 прочесть слово Dialing.

Есть ли способ?
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35050173
шпщк_123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в мсдн был пример перенаправления вывода консоли в нужное тебе место. В том числе и на VB. Поищи!
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35050516
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я нашел 2 ссылки: 1-я по сути повторяет уже приведенную выше
http://support.microsoft.com/kb/171654/en-us#appliesto


Вот это может быть? Но ощущение, что не то.
http://support.microsoft.com/kb/150767/en-us

Нужен непрерывный вывод, а целиком под конец все из файла можно и так считать (proga.exe > 1.txt) -это не интересно.
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35051401
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сегодня добрый, на инструкцию:
http://www.sources.ru/msdn/howto/q171654.shtml
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35051716
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я там уже дважды был-см.выше.
sOut = "Hi There" & vbCrLf -выводит в консоль
C:\TEST.BAT -запускается в этой консоли
А как мне сделать Msgbox "Результаты деятельности test.bat",
причем не после завершения test.bat а в процессе получения информации от test.bat
test.bat не очень удачный пример, см.мой пример, кот.выводит в течении 2-3 минут.
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35051719
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. надо считывать информацию по мере поступления в консоль, аналогично тому как я это делаю в MSComm (com-порт-gjhn) и WinSock(TCP-IP)
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35053618
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее если копать глубже:
http://msdn2.microsoft.com/en-us/library/ms682073.aspx

Код: plaintext
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.
BOOL WINAPI WriteConsole(
  __in        HANDLE hConsoleOutput,
  __in        const VOID* lpBuffer,
  __in        DWORD nNumberOfCharsToWrite,
  __out       LPDWORD lpNumberOfCharsWritten,
  __reserved  LPVOID lpReserved
);
//Implemented as WriteConsoleW (Unicode) and WriteConsoleA (ANSI).


BOOL WINAPI ReadConsole(
  __in      HANDLE hConsoleInput,
  __out     LPVOID lpBuffer,
  __in      DWORD nNumberOfCharsToRead,
  __out     LPDWORD lpNumberOfCharsRead,
  __in_opt  LPVOID pInputControl
);
//Implemented as ReadConsoleW (Unicode) and ReadConsoleA (ANSI).


BOOL WINAPI ReadConsoleOutput(
  __in     HANDLE hConsoleOutput,
  __out    PCHAR_INFO lpBuffer,
  __in     COORD dwBufferSize,
  __in     COORD dwBufferCoord,
  __inout  PSMALL_RECT lpReadRegion
);
//Implemented as ReadConsoleOutputW (Unicode) and ReadConsoleOutputA (ANSI).


В укажанной вами ссылке для VB имеем пример:
Код: plaintext
1.
2.
3.
   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

По аналогии я бы задекларировал это дело так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
   Declare Function ReadConsole Lib "kernel32" Alias "ReadConsoleA" _
           (ByVal hConsoleInput As Long, lpBuffer As Any, ByVal _
           nNumberOfCharsToRead As Long, lpNumberOfCharsRead As Long, _
           pInputControl As Any) As Long

   Declare Function ReadConsoleOutput Lib "kernel32" Alias "ReadConsoleOutputA" _
           (ByVal hConsoleOutput As Long, lpBuffer As Any, ByVal _
           dwBufferSize As Long, dwBufferCoord As Long, _
           lpReadRegion As Any) As Long

(первую видимо угадал, в правильности написания второй есть сомнения, но пока не уловил, которая из них мне нужна)

Далее туплю,попытался "модифицировать" код из примера,типа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
   Private Sub Command1_Click()
   Dim Result As Long, sOut As String, cWritten As Long
   Dim Result1 As Long, sIn As String, cWritten1 As Long
     sOut = "Hi There" & vbCrLf
     Result = WriteConsole(hConsole, ByVal sOut, Len(sOut), cWritten, _
                           ByVal  0 &)
     Shell "C:\111\TEST.BAT"
     Result1 = ReadConsole(hConsole, sIn,  200 , cWritten1, ByVal  0 &)
     MsgBox sIn
   End Sub

Оно не ругнулось, стало быть угадал в декларировании, однако MsgBox выдался пустой.
Техники не могу уловить, как этот буфер консоли отлавливать.
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35053667
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
Option Explicit

Private Declare Function CreatePipe Lib "kernel32" (phReadPipe _
        As Long, phWritePipe As Long, lpPipeAttributes As Any, _
        ByVal nSize As Long) As Long
        
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile _
        As Long, ByVal lpBuffer As String, ByVal _
        nNumberOfBytesToRead As Long, lpNumberOfBytesRead As _
        Long, ByVal lpOverlapped As Any) As Long
          
Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
        lpApplicationName As Long, ByVal lpCommandLine As _
        String, lpProcessAttributes As Any, lpThreadAttributes _
        As Any, ByVal bInheritHandles As Long, ByVal _
        dwCreationFlags As Long, ByVal lpEnvironment As Long, _
        ByVal lpCurrentDirectory As Long, lpStartupInfo As Any, _
        lpProcessInformation As Any) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal _
        hObject As Long) As Long

Private Declare Function PeekNamedPipe Lib "kernel32" (ByVal _
        hNamedPipe As Long, lpBuffer As Any, ByVal nBufferSize _
        As Long, lpBytesRead As Long, lpTotalBytesAvail As Long, _
        lpBytesLeftThisMessage As Long) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" ( _
        ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
        
Private Type SECURITY_ATTRIBUTES
  nLength As Long
  lpSecurityDescriptor As Long
  bInheritHandle As Long
End Type
      
Private Type STARTUPINFO
  cb As Long
  lpReserved As Long
  lpDesktop As Long
  lpTitle As Long
  dwX As Long
  dwY As Long
  dwXSize As Long
  dwYSize As Long
  dwXCountChars As Long
  dwYCountChars As Long
  dwFillAttribute As Long
  dwFlags As Long
  wShowWindow As Integer
  cbReserved2 As Integer
  lpReserved2 As Long
  hStdInput As Long
  hStdOutput As Long
  hStdError As Long
End Type
      
Private Type PROCESS_INFORMATION
  hProcess As Long
  hThread As Long
  dwProcessID As Long
  dwThreadID As Long
End Type
         
Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const STARTF_USESTDHANDLES = &H100&
Private Const STARTF_USESHOWWINDOW = &H1
      
Private Declare Function CharToOem Lib "user32" Alias "CharToOemA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
            
Private Sub Command1_Click()
    
    If Len(Trim$(Me.Text2.Text)) >  0  Then
        Screen.MousePointer =  11 
        Me.Text1.Text = ""
        Text1.Text = ExecCmd(Me.Text2.Text)
        Screen.MousePointer =  0 
    End If
    
End Sub

Private Function ExecCmd(ByVal cmdline As String) As String
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
Dim sa As SECURITY_ATTRIBUTES
Dim hReadPipe As Long, hWritePipe As Long
Dim L As Long, Result As Long, bSuccess As Long
Dim Buffer As String
Dim s As String
Dim sss As String
Dim retText As String
    
    sa.nLength = Len(sa)
    sa.bInheritHandle =  1 &
    sa.lpSecurityDescriptor =  0 &
    Result = CreatePipe(hReadPipe, hWritePipe, sa,  0 )
   
    If Result =  0  Then
        MsgBox "CreatePipe failed Error!"
        Exit Function
    End If
   
    start.cb = Len(start)
    start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
    start.hStdOutput = hWritePipe
    
    
    Result = CreateProcessA( 0 &, cmdline, sa, sa,  1 &, _
        NORMAL_PRIORITY_CLASS,  0 &,  0 &, start, proc)

    If Result <>  0  Then
        
        Dim lPeekData As Long
        
        Do
            Call PeekNamedPipe(hReadPipe, ByVal  0 &,  0 &, ByVal  0 &, _
                lPeekData, ByVal  0 &)
            
            If lPeekData >  0  Then
                Buffer = Space$(lPeekData)
                bSuccess = ReadFile(hReadPipe, Buffer, Len(Buffer), L,  0 &)
                
                If bSuccess =  1  Then
                    
                    s = Left(Buffer, L)
                    sss = Space$(Len(s))
                    OemToChar s, sss
                    
                    retText = retText & sss
                    
                Else
                    MsgBox "ReadFile failed!"
                End If
            Else
                bSuccess = WaitForSingleObject(proc.hProcess,  0 &)
                        
                If bSuccess =  0  Then
                    Exit Do
                End If
            End If
            
            DoEvents
        Loop
            
    Else
        MsgBox "Error while starting process!"
    End If
    
    Call CloseHandle(proc.hProcess)
    Call CloseHandle(proc.hThread)
    Call CloseHandle(hReadPipe)
    Call CloseHandle(hWritePipe)
    
    ExecCmd = retText
End Function

Private Sub Form_Load()
    Command1.Caption = "Start"
End Sub
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35054004
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я ваш код оценил, даже сделал для теста вот так:
Код: plaintext
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.
       Do
            Call PeekNamedPipe(hReadPipe, ByVal  0 &,  0 &, ByVal  0 &, _
                lPeekData, ByVal  0 &)
            
            If lPeekData >  0  Then
                Buffer = Space$(lPeekData)
                bSuccess = ReadFile(hReadPipe, Buffer, Len(Buffer), L,  0 &)
                
                If bSuccess =  1  Then
                    
                    s = Left(Buffer, L)
                    sss = Space$(Len(s))
                    OemToChar s, sss
'-------------------------------------------------------------------------------------------
                    MsgBox sss
'-------------------------------------------------------------------------------------------
                    retText = retText & sss
                    
                Else
                    MsgBox "ReadFile failed!"
                End If
            Else
                bSuccess = WaitForSingleObject(proc.hProcess,  0 &)
                        
                If bSuccess =  0  Then
                    Exit Do
                End If
            End If
            
            DoEvents
        Loop
 

И те строчки, которые я привел в начале топика, т.е. то что выводится в течении нескольких минут, выдались мне в MsgBox целиком , мне же надо их считывать в тот момент, как они возникают на экране.
Если я просто в командной строке пишу proga.exe > 1.txt то файл 1.txt у меня пустой и заполняется целиком лишь по окончании процесса. А ваш код ведет себя похоже точно также, т.е.Buffer не заполняется до самого конца работы программы, или я что-то не допонял?

Т.е. на экране я уже вижу строчку, следующая будет напр.через минуту, но ни в 1.txt, ни в bufer ничего нет, а надо чтобы это уже где-то было.
Понятно, чтобы получить лог, вполне достаточно прочесть все в конце процесса, но хочется еще наблюдать за процессом из удобного интерфейса, коим консоль на мой взгляд не является, и я бы ее запускал "невидимо". Ибо если у меня одна консоль, это еще худо-бедно, а если у меня 4 линии (консоли) то это уже совсем хреново.
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35054437
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел вот даже такую умную штуку,где есть куча всего:

http://vb.mvps.org/samples/project.asp?id=console

Максимум чего научился, считывать то что введено в консоль с клавиатуры.

А если переформулировать вопрос.
Можно ли тупо прочитать все то что написано в консоли в текущий момент времени?
Т.е. msgbox "все то, что вижу на черном экране".
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35055416
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Debug.Print вместо MsgBox не пробовали использовать?
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35055464
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще вот это почитай, возможно в твоем случае ничего не поможет.
http://support.microsoft.com/kb/190351
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35055561
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще , попробуй добавить:



...
start.hStdOutput = hWritePipe
start.hStdError = hWritePipe
...
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35055945
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот попробуй так, stderror сам прикрути по аналогии:


Код: plaintext
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.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
Option Explicit

Private Declare Function DuplicateHandle Lib "kernel32" (ByVal hSourceProcessHandle As Long, ByVal hSourceHandle As Long, ByVal hTargetProcessHandle As Long, lpTargetHandle As Long, ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwOptions As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function ExitProcess Lib "kernel32" (ByVal uExitCode As Long)
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Private Declare Function CreatePipe Lib "kernel32" (phReadPipe _
        As Long, phWritePipe As Long, lpPipeAttributes As Any, _
        ByVal nSize As Long) As Long
        
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile _
        As Long, ByVal lpBuffer As String, ByVal _
        nNumberOfBytesToRead As Long, lpNumberOfBytesRead As _
        Long, ByVal lpOverlapped As Any) As Long
          
Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
        lpApplicationName As Long, ByVal lpCommandLine As _
        String, lpProcessAttributes As Any, lpThreadAttributes _
        As Any, ByVal bInheritHandles As Long, ByVal _
        dwCreationFlags As Long, ByVal lpEnvironment As Long, _
        ByVal lpCurrentDirectory As Long, lpStartupInfo As Any, _
        lpProcessInformation As Any) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal _
        hObject As Long) As Long

Private Declare Function PeekNamedPipe Lib "kernel32" (ByVal _
        hNamedPipe As Long, lpBuffer As Any, ByVal nBufferSize _
        As Long, lpBytesRead As Long, lpTotalBytesAvail As Long, _
        lpBytesLeftThisMessage As Long) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" ( _
        ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
        
Private Type SECURITY_ATTRIBUTES
  nLength As Long
  lpSecurityDescriptor As Long
  bInheritHandle As Long
End Type
      
Private Type STARTUPINFO
  cb As Long
  lpReserved As Long
  lpDesktop As Long
  lpTitle As Long
  dwX As Long
  dwY As Long
  dwXSize As Long
  dwYSize As Long
  dwXCountChars As Long
  dwYCountChars As Long
  dwFillAttribute As Long
  dwFlags As Long
  wShowWindow As Integer
  cbReserved2 As Integer
  lpReserved2 As Long
  hStdInput As Long
  hStdOutput As Long
  hStdError As Long
End Type
      
Private Type PROCESS_INFORMATION
  hProcess As Long
  hThread As Long
  dwProcessID As Long
  dwThreadID As Long
End Type

Private Const INFINITE = &HFFFF
Private Const DUPLICATE_SAME_ACCESS = &H2
         
Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const STARTF_USESTDHANDLES = &H100&
Private Const STARTF_USESHOWWINDOW = &H1
      
Private Declare Function CharToOem Lib "user32" Alias "CharToOemA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
            
            
Dim bExit As Boolean
'

Private Sub Command1_Click()
Dim s As String

    If Len(Trim$(Me.Text2.Text)) >  0  Then
        Screen.MousePointer =  11 
        bExit = False
        Me.Command2.Enabled = True
        s = ExecCmd(Me.Text2.Text, Me.Text1)
        Me.Text1.SelStart = Len(Me.Text1.Text)
        Me.Text1.SelText = s
        Me.Command2.Enabled = False
        Screen.MousePointer =  0 
    End If
    
End Sub

Private Function ExecCmd(ByVal cmdline As String, ByRef OUT As VB.TextBox) As String
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
Dim sa As SECURITY_ATTRIBUTES
Dim L As Long, Result As Long, bSuccess As Long
Dim Buffer As String
Dim s As String
Dim sss As String
Dim hReadPipe As Long, hWritePipe As Long
Dim hReadStdOutputDup As Long
Dim hReadStdError As Long
Dim hWriteStdError As Long
Dim hReadStdErrorDup As Long

    OUT.Text = ""
    
    sa.nLength = Len(sa)
    sa.bInheritHandle =  1 &
    sa.lpSecurityDescriptor =  0 &
    
    start.cb = Len(start)
    start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
    
    Result = CreatePipe(hReadPipe, hWritePipe, sa,  0 )
    If Result =  0  Then
        ExecCmd = "ERROR: CreatePipe failed Error!"
        GoTo lb_out
    End If
    If DuplicateHandle(GetCurrentProcess(), hReadPipe, GetCurrentProcess(), hReadStdOutputDup,  0 &,  0 &, DUPLICATE_SAME_ACCESS) =  0  Then
        ExecCmd = "ERROR: " & Err.LastDllError & " DuplicateHandle ReadPipe."
        GoTo lb_out
    End If
    start.hStdOutput = hWritePipe
    
    If CreatePipe(hReadStdError, hWriteStdError, sa,  0 ) =  0  Then
        ExecCmd = "ERROR: " & Err.LastDllError & " CreatePipe StdError."
        GoTo lb_out
    End If
    If DuplicateHandle(GetCurrentProcess(), hReadStdError, GetCurrentProcess(), hReadStdErrorDup,  0 &,  0 &, DUPLICATE_SAME_ACCESS) =  0  Then
        ExecCmd = "ERROR: " & Err.LastDllError & " DuplicateHandle ReadStdError."
        GoTo lb_out
    End If
    start.hStdError = hWriteStdError
    
    
    Result = CreateProcessA( 0 &, cmdline, sa, sa,  1 &, _
        NORMAL_PRIORITY_CLASS,  0 &,  0 &, start, proc)

    If Result <>  0  Then
        
        Dim lPeekData As Long
        
        Do
            Call PeekNamedPipe(hReadStdOutputDup, ByVal  0 &,  0 &, ByVal  0 &, _
                lPeekData, ByVal  0 &)
            
            If lPeekData >  0  Then
                Buffer = Space$(lPeekData)
                bSuccess = ReadFile(hReadStdOutputDup, Buffer, Len(Buffer), L,  0 &)
                
                If bSuccess =  1  Then
                    
                    s = Left(Buffer, L)
                    sss = Space$(Len(s))
                    OemToChar s, sss
                    
                    OUT.SelStart = Len(OUT.Text)
                    OUT.SelText = sss
                    
                Else
                    ExecCmd = "ERROR: ReadFile failed!"
                    Exit Do
                End If
            Else
                bSuccess = WaitForSingleObject(proc.hProcess,  0 &)
                        
                If bSuccess =  0  Then
                    Exit Do
                End If
            End If
            
            If bExit Then
                bExit = False
                TerminateProcess proc.hProcess, Result
                ExecCmd = vbCrLf & "Stopped."
                GoTo lb_out
            End If
            
            DoEvents
        Loop
        ExecCmd = vbCrLf & "Success."
            
    Else
        ExecCmd = "ERROR: Error while starting process!"
    End If
    
lb_out:
    Call CloseHandle(proc.hProcess)
    Call CloseHandle(proc.hThread)
    Call CloseHandle(hReadPipe)
    Call CloseHandle(hWritePipe)
    Call CloseHandle(hReadStdError)
    Call CloseHandle(hWriteStdError)
    Call CloseHandle(hReadStdOutputDup)
    Call CloseHandle(hReadStdErrorDup)
    
    
End Function

Private Sub Command2_Click()
    bExit = True
    Me.Command1.Enabled = True
    Me.Command2.Enabled = False
    Screen.MousePointer =  0 
End Sub

Private Sub Form_Load()
    Command1.Caption = "Start"
    Me.Command2.Enabled = False
End Sub
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35055984
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, ничего не помогло. Выводит все скопом и лишь в конце своей работы.

Приложение, о котором идет речь - маленькая утилита от разработчика и назначение ее - дослать факс через свою спецефическую TAPI-fax-line. Прелесть ее в том, что она каким-то боком используя Microsoft Fax не использует сам сервер,т.е. работает "в обход". Т.е. если например в XP есть ограничение 1 факс-девайс одновременно, то ничто не мешает запустить мне 3 экземпляра этой программы одновременно.
У меня мной давно написано приложение, кот. делает то же самое, но в отличие от утилиты работает непосредсвенно с Microsoft-fax сервером.Т.е. создает факс-задание а потом отслеживает состояние этого задания через ф-ции факс-сервера. Эдакий непрерывный долбеж по факс серверу. В принципе моя штука работает достаточно устойчиво но:

1)Многоканально она может работать только на win2003, ибо xp позволяет только один канал, и на мою программу это распостраняется
2)Периодически надо вычищать консоль факсов от мусора из недосланных и досланных факсов (на эту тему утилиту я тоже написал)
3) Т.к. консольное приложение написано профессионалами, оно надежней, да оно и по логике гораздо более прямолинейное и понятное, я бы конечно предпочел запускать его, а не возиться с сообщениями сервера.

Я написал разработчикам письмо на тему что-либо поменять с выводом в понятное место (ну напр. добавить REAL-time log) или дать исходный код (утилиты, понятно, а не их основного коммерческого продукта), есть шанс что помощь придет "оттуда".
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35056016
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я проверял на:

ping -t www.sql.ru
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35056020
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот исходник в сборе.
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35056156
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneя проверял на:

ping -t www.sql.ru

Что я вам могу на это сказать...
Ping у меня тоже работает красиво с вашим исходником (собственно, текста в форуме было достаточно).
Следуя своей логике, я не поленился запустить в консоли (без всякого програмирования) команду
ping -t www.sql.ru > 1.txt
и открывая этот файл в процессе работы в другом окне far убеждался в том, что строчек в 1.txt становится все больше и больше, т.е. даже не используя ваш пример я бы просто читал 1.txt раз в 1сек, и получал бы оттуда все что надо.
А вот с этой коварной утилитой - весь вывод лишь в конце ее работы. Я так понимаю, смысл статьи, что вы предлагали почитать, что "вот-де есть такие коварные приложения типа рассматриваемого, которые -де так вот плохо себя ведут, как я описываю".
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35056226
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавьте в цикл обработку пайпа hReadStdErrorDup по аналогии с hReadStdOutputDup
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35056356
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
start.hStdOutput = hWritePipe
    start.hStdError = hWritePipe

    
    Result = CreateProcessA( 0 &, cmdline, sa, sa,  1 &, _
        NORMAL_PRIORITY_CLASS,  0 &,  0 &, start, proc)

    If Result <>  0  Then
        
        Dim lPeekData As Long
        
        Do
            Call PeekNamedPipe(hReadStdOutputDup, ByVal  0 &,  0 &, ByVal  0 &, _
                lPeekData, ByVal  0 &)
            
            If lPeekData >  0  Then
                Buffer = Space$(lPeekData)
                bSuccess = ReadFile(hReadStdOutputDup, Buffer, Len(Buffer), L,  0 &)
                
                If bSuccess =  1  Then
                    
                    s = Left(Buffer, L)
                    sss = Space$(Len(s))
                    OemToChar s, sss
                    
                    OUT.SelStart = Len(OUT.Text)
                    OUT.SelText = sss
                    
                Else
                    ExecCmd = "ERROR: ReadFile failed!"
                    Exit Do
                End If
            Else
                bSuccess = WaitForSingleObject(proc.hProcess,  0 &)
                        
                If bSuccess =  0  Then
                    Exit Do
                End If
            End If
            
            Call PeekNamedPipe(hReadStdErrorDup, ByVal  0 &,  0 &, ByVal  0 &, _
                lPeekData, ByVal  0 &)
            
            If lPeekData >  0  Then
                Buffer = Space$(lPeekData)
                bSuccess = ReadFile(hReadStdErrorDup, Buffer, Len(Buffer), L,  0 &)
                
                If bSuccess =  1  Then
                    
                    s = Left(Buffer, L)
                    sss = Space$(Len(s))
                    OemToChar s, sss
                    
                    OUT.SelStart = Len(OUT.Text)
                    OUT.SelText = sss
                    
                Else
                    ExecCmd = "ERROR: ReadFile failed!"
                    Exit Do
                End If
            Else
                bSuccess = WaitForSingleObject(proc.hProcess,  0 &)
                        
                If bSuccess =  0  Then
                    Exit Do
                End If
            End If
            
            If bExit Then
                bExit = False
                TerminateProcess proc.hProcess, Result
                ExecCmd = vbCrLf & "Stopped."
                GoTo lb_out
            End If
            
            DoEvents
        Loop
        ExecCmd = vbCrLf & "Success."

???(возможно натупил) не хочет...
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35056375
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда видно все-таки это:

Note Some console based applications do not use the standard handles for their input/output (IO) operations. The Win32 API does not support redirection of these processes.
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35056458
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneтогда видно все-таки это:

Note Some console based applications do not use the standard handles for their input/output (IO) operations. The Win32 API does not support redirection of these processes.

Я именно на это и обратил внимание, когда писал
Я писал...Я так понимаю, смысл статьи, что вы предлагали почитать, что "вот-де есть такие коварные приложения типа рассматриваемого, которые -де так вот плохо себя ведут, как я описываю".

Но ведь в консоль же она как-то из себя пишет? Нельзя эту консоль целиком прочесть как есть? Или это уже картинка просто после вывода?
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35056473
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
видно в конце работы это приложение все что было вываливает в консоль, а до этого работает с ней в графическом режиме (скорее всего писали ее на C++)
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35056520
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneскорее всего писали ее на C++
Понятно, что не на VB. Если хотите, могу кинуть exe-шник (69кб), запускать его вам бесполезно (да и неправильно чужие exe-шники запускать) если только по F3 или каким hiew-вьюером глянуть, может больше моего в нем увидете.
...
Рейтинг: 0 / 0
Чтение результатов работы консольного приложения
    #35056540
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спс конечно за доверие, но как-то нет особого желания. думаю, что осается бодаться вам с разработчиками данной утилиты, чтобы они вам пошли навстречу в этом вопросе.
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Чтение результатов работы консольного приложения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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