Перенаправление сообщений exe-файла, выполняемого в DOS-окне

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Перенаправление сообщений exe-файла, выполняемого в DOS-окне

Сообщение dimix » 28.02.2005 (Пн) 19:11

Имеем exe-шник, который выполняется в DOS-окне. Т.е. при запуске exe он открывает DOS-окно, чего-то делает и в этом окне отображает результат выполнения (или комментирует процесс выполнения). Этот exe-шник я запускаю из своей программы через Shell (и ожидаю окончание Waiter'ом от GSerg, если это важно). Есть ли возможность сделать так, чтобы сообщения, выводимые в DOS-окне, выводились и в моей программе (не важно в каком виде, пусть хоть на форме печатаются)? Интересует несложный вариант (если варианты вообще есть :) ) либо сложный, но в виде готового примера. Ибо написать что-то сложное самому - знаний не хватит :scratch:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.02.2005 (Пн) 19:17

Нет, это не важно :)


API-Guide, функция CreatePipe.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.02.2005 (Пн) 19:26

Хотя там не совсем правильный пример :)
И в MSDN тоже не совсем корректный пример...
А вот если их объединить :)

На форме два текстбокса, один будет посылать команды в прогу, другой считывать. Таймер для считывания. Название проги заменить на своё :)
Код: Выделить всё
Option Explicit

Private Declare Function CreatePipe Lib "kernel32.dll" (ByRef phReadPipe As Long, ByRef phWritePipe As Long, ByRef lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
Private Declare Function GetStdHandle Lib "kernel32.dll" (ByVal nStdHandle As Long) As Long
Private Declare Function SetStdHandle Lib "kernel32.dll" (ByVal nStdHandle As Long, ByVal nHandle As Long) As Long
Private Declare Function LocalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal wBytes As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function DuplicateHandle Lib "kernel32.dll" (ByVal hSourceProcessHandle As Long, ByVal hSourceHandle As Long, ByVal hTargetProcessHandle As Long, ByRef lpTargetHandle As Long, ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwOptions As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
Private Declare Function CreateProcess Lib "kernel32.dll" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByRef lpProcessAttributes As Any, ByRef lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByRef lpEnvironment As Any, ByVal lpCurrentDriectory As String, ByRef lpStartupInfo As STARTUPINFO, ByRef lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function TerminateProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function PeekNamedPipe Lib "kernel32.dll" (ByVal hNamedPipe As Long, ByRef lpBuffer As Any, ByVal nBufferSize As Long, ByRef lpBytesRead As Long, ByRef lpTotalBytesAvail As Long, ByRef lpBytesLeftThisMessage As Long) As Long
Private Declare Function ReadFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByRef lpOverlapped As Any) As Long
Private Declare Function WriteFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, ByRef lpNumberOfBytesWritten As Long, ByRef lpOverlapped As Any) As Long

Private Const DUPLICATE_SAME_ACCESS As Long = &H2

Private Const STARTF_USESHOWWINDOW As Long = &H1
Private Const STARTF_USESTDHANDLES As Long = &H100

Private Type SECURITY_ATTRIBUTES
  nLength As Long
  lpSecurityDescriptor As Long
  bInheritHandle As Long
End Type

Private Type PROCESS_INFORMATION
  hProcess As Long
  hThread As Long
  dwProcessId As Long
  dwThreadId 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 Byte
  hStdInput As Long
  hStdOutput As Long
  hStdError As Long
End Type

Private hChildStdinRd As Long, hChildStdinWr As Long, hChildStdinWrDup As Long
Private hChildStdoutRd As Long, hChildStdoutWr As Long, hChildStdoutRdDup As Long

Private piProcInfo As PROCESS_INFORMATION


'Pipe is a operation system object that is often used for interprocess communication.
'There can be named and unnamed pipes.
'You've specified that w98 must be supported.
'w98 can create only unnamed pipes, and that pipes are single-directed (no duplex).
'So, we must create 2 pipes - to read and to write.

Private Sub Form_Load()
  Dim saAttr As SECURITY_ATTRIBUTES
 
  saAttr.nLength = Len(saAttr)
  saAttr.bInheritHandle = 1       'or child process will not get pipe handles
  saAttr.lpSecurityDescriptor = 0
 
' Create a pipe for the child process's STDOUT.
  CreatePipe hChildStdoutRd, hChildStdoutWr, saAttr, 0

' Handle inheritance is a technique through which child process gets
' handles it should get.

' Create noninheritable read handle and close the inheritable read
' handle. Child doesn't need that handle - so, it won't get it.
  DuplicateHandle GetCurrentProcess, hChildStdoutRd, GetCurrentProcess, hChildStdoutRdDup, 0, 0, DUPLICATE_SAME_ACCESS
 
  'Each handle must be closed when it's not useful any more.
  CloseHandle hChildStdoutRd

' Create a pipe for the child process's STDIN.
  CreatePipe hChildStdinRd, hChildStdinWr, saAttr, 0

' Duplicate the write handle to the pipe so it is not inherited.
  DuplicateHandle GetCurrentProcess, hChildStdinWr, GetCurrentProcess, hChildStdinWrDup, 0, 0, DUPLICATE_SAME_ACCESS
  CloseHandle hChildStdinWr

' Now create the child process.
  CreateProc

  Timer1.Enabled = True
End Sub

Private Sub CreateProc()
  Dim siStartInfo As STARTUPINFO
 
  siStartInfo.cb = Len(siStartInfo)
  siStartInfo.dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
  siStartInfo.wShowWindow = 0             'completely hide child
  siStartInfo.hStdInput = hChildStdinRd   'explicitly set child's input and output handles
  siStartInfo.hStdOutput = hChildStdoutWr

' Create the child process.
  If CreateProcess(vbNullString, "crafty-19.3.exe", ByVal 0&, ByVal 0&, 1, 0, ByVal 0&, vbNullString, siStartInfo, piProcInfo) = 0 Then
    MsgBox "Cannot run Crafty!", vbCritical
    Unload Me
  End If
End Sub

Private Sub Timer1_Timer()
  Dim b() As Byte, nCount As Long, t As Long
 
  'ReadFile can block execution if there is nothing to read.
  'So, check first (PeekNamedPipe never blocks execution).
  PeekNamedPipe hChildStdoutRdDup, ByVal 0&, 0, ByVal 0&, nCount, ByVal 0&
 
  If nCount > 0 Then
    ReDim b(1 To nCount)   'allocate buffer
    ReadFile hChildStdoutRdDup, b(LBound(b)), nCount, t, ByVal 0&
    'replace different line breaks.
    'Also note that buffer is in ANSI, while VB uses Unicode. We have to explicitly convert it.
    txtOutput.Text = txtOutput.Text & StrConv(b, vbUnicode)
    txtOutput.SelStart = Len(txtOutput.Text)
  End If
End Sub

Private Sub txtInput_KeyPress(KeyAscii As Integer)
  Dim b() As Byte, t As Long
 
  If KeyAscii = vbKeyReturn Then   'when ENTER pressed...
    'convert from VB format to Crafty's
    b = StrConv(txtInput.Text & vbNewLine, vbFromUnicode)
    'send it to child.
    'child doesn't even know that it's not from keyboard...
    WriteFile hChildStdinWrDup, b(LBound(b)), UBound(b) - LBound(b) + 1, t, ByVal 0&
    txtInput.Text = vbNullString
  End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
  TerminateProcess piProcInfo.hProcess, 0
  CloseHandle piProcInfo.hProcess
  CloseHandle piProcInfo.hThread
End Sub



vbskb_api vbskb_pipe vbskb_console vbskb_ipc
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 28.02.2005 (Пн) 21:15

"Мать... мать... мать..." - привычно отозвалось эхо :)
Это моя реакция при скроллинге ответа :)
GSerg, это ты все для меня написал? :D

Огромное спасибо!!! Буду пробовать.
Но ведь я так просто не отстану :) (спорим, ты это подозревал :wink: ).

Вопрос 1. Зачем поле для отсылки в exe? Это типа если exe просит что-то нажать или ввести, мы ему это посылаем, как будто прямо в нем с клавы ввели?

Вопрос 2. Я правильно понял - Waiter! тут уже не нужен? Тогда чем такое общение с exe хуже, чем запуск exe Waiter'ом? Основной поток не будет выполняться?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.03.2005 (Вт) 6:46

Нет, не для тебя, а кому-то давно и за деньги ($10) :)

1. Чтобы ты знал, как и это делать тоже :) Не надо - вырезаем, второй пайп не создаём, и его хэндлы, естественно, не дублируем. Да, с точки зрения проги это вводят с клавиатуры :)
2. Не совсем :) Та прога, которая у меня была, вела с юзером диалог, и сама не закрывалась. Поэтому ждать её бессмысленно. В твоём случае будет, к примеру, что прога только выводит, а ждёшь её Waiter!'ом :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 01.03.2005 (Вт) 8:27

А можно и попроще - достаточно посмотреть Help по WshScriptExec Object... Примеры есть в самом Help-e.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 01.03.2005 (Вт) 9:32

Andrey Fedorov писал(а):А можно и попроще - достаточно посмотреть Help по WshScriptExec Object... Примеры есть в самом Help-e.


Не говори... Троица огалделых Апишников из .... ларца
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

sanekz
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 07.05.2006 (Вс) 20:42

Сообщение sanekz » 09.06.2006 (Пт) 20:35

Мужики а че ошибку выдает Cannot run Crafty!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.06.2006 (Сб) 3:47

А головой надо просто думать и в код смотреть, вместо того, чтобы бездумно копипастить.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 10.06.2006 (Сб) 14:13

А зачем удалили ссылку, которая здесь была? Нормальная такая ссылка...
http://www.freevbcode.com/ShowCode.asp?ID=3957

P.S. GSerg, каждому свое: кому-то головой думать, а кому-то хватит и copy/paste.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.06.2006 (Сб) 14:21

VVitafresh
В данном конкретном случае "думать головой" означает "догадаться, что надо заменить прописанный в коде exe собственным".
Это слишком?
Тогда извините.
Последний раз редактировалось GSerg 10.06.2006 (Сб) 14:31, всего редактировалось 1 раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 10.06.2006 (Сб) 14:28

Согласен -- это элементарно. Но, как видишь, не для всех :)
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

sanekz
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 07.05.2006 (Вс) 20:42

Сообщение sanekz » 10.06.2006 (Сб) 19:36

А где нужно там прописать то?

kostyanet
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 10.06.2006 (Сб) 10:36

Сообщение kostyanet » 10.06.2006 (Сб) 20:32

А почему удалили мое сообщение со ссылкой на готовый код класса DosOutput?

---

А, вот в чем тут дело. Посмотрел листинг выше - так это оно и есть. Типа копипейщено. Приспособлено, конечно, для своих нужд.

Нормально, то есть, шаман так борется за чистоту своего реноме - ему можно копипейстить, а другим, даже в разделе для новичков (у кого меньше 120 постов) - ни-ни.

Ы :lol:
Последний раз редактировалось kostyanet 10.06.2006 (Сб) 20:50, всего редактировалось 1 раз.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 10.06.2006 (Сб) 20:41

sanekz, а это домашнее задание. Найдешь - конфетка твоя.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.06.2006 (Сб) 21:02

kostyanet писал(а):А, вот в чем тут дело. Посмотрел листинг выше - так это оно и есть. Типа копипейщено. Приспособлено, конечно, для своих нужд.

Дело здесь не в том, что копипастить плохо.
А в том, что отвечать, не читая топика -- ещё хуже.
Изображение

sanekz
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 07.05.2006 (Вс) 20:42

Сообщение sanekz » 10.06.2006 (Сб) 21:07

Amed писал(а):sanekz, а это домашнее задание. Найдешь - конфетка твоя.

Я же серьезно спрашиваю хорош прикалываться

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 10.06.2006 (Сб) 22:10

sanekz, как же не прикалываться, если ты спрашиваешь элементарные вещи. Не нужно вникать в тонкости реализации примера GSerg'a, достаточно прочитать внимательно http://bbs.vbstreets.ru/viewtopic.php?t=14067#99127.

Хинт: Как ты думаешь, что такое crafty-19.3.exe?
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 10.06.2006 (Сб) 22:19

Это уже наглость. Сначала поднял топик полуторалетней давности, потом "хорош прикалываться".

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.06.2006 (Вс) 5:27

kostyanet писал(а):А, вот в чем тут дело. Посмотрел листинг выше - так это оно и есть. Типа копипейщено. Приспособлено, конечно, для своих нужд.

Нормально, то есть, шаман так борется за чистоту своего реноме - ему можно копипейстить, а другим, даже в разделе для новичков (у кого меньше 120 постов) - ни-ни.

Ы :lol:


Таки скажу, хоть ты этого, по всей видимости, не стОишь (дабы слова твои не сеяли ложь безнаказанно).

Видимо, с восприятием проблемы у человека.
Все, у кого указанные проблемы отсутствуют, вольны проследовать по ссылке и поискать общие моменты у двух кусков кода, за исключением declare function CreatePipe.

Потом можно сходить сюда за объяснением того, почему вышеприведённый пример был создан. Впрочем, http://bbs.vbstreets.ru/viewtopic.php?p=6604752#6604752 - это слишком далеко, достаточно даже http://bbs.vbstreets.ru/viewtopic.php?p=99127#99127.

Юзать моск полезно. Равно как и читать топик, а не только название. Вместо "Ы".
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 11.06.2006 (Вс) 11:33

GSerg, не мне делать тебе замечания, но отвечать в закрытый топик, пользуясь возможностью модератора, некрасиво, отвечая кому бы то ни было.

Топик открываю, желающие могут высказаться. Только лучше молчать.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.06.2006 (Вс) 11:38

Вот именно, отвечать.
Не начинать, заметь, а отвечать. На тот, с позволения сказать, текст, который ты и закрыл.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

kostyanet
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 10.06.2006 (Сб) 10:36

Сообщение kostyanet » 11.06.2006 (Вс) 16:28

Ну ладно, а кто удалил и главное - зачем - ссылку на класс DosOutputs, которому, кстати, в обед триста лет. Это вопрос.

Это типа тут стиль "мы-то с вами знаем" процветает?

Фишка в том что я вообще не программист, и меня программирование не колебет за пределами того софта, который я сам себе как ламер написал. И я знаю что такое народное программирование благодаря развитию визуальных средств становится все популярнее.

И если вы открыли площадку для обмена идеями, то закройте ее - если вас ламеры так раздражают своими глупыми вопросами, и главное - глупыми ответами, не в стиле "мы-то-с-вами-знаем".

Автору: начните не с поиска ответа, а с вопроса самому себе - в какое место этого кода вам нужно воткнуть имя _вашего_ екзешника.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.06.2006 (Вс) 16:36

kostyanet писал(а):Ну ладно,

Сколь, однако, тонкий уход от всего сказанного!
Аплодисменты, крики "Браво!"; две впечатлительные барышни падают в обморок.


kostyanet писал(а):кто удалил и главное - зачем - ссылку на класс DosOutputs, которому, кстати, в обед триста лет. Это вопрос.

Это совершенно не вопрос. Её удалил я, ибо через год постить в топик ответ, давно находящийся в нём - тупо.

Кстати, не вы ли, г-н kostyanet, были замечены в том же ещё раз? http://bbs.vbstreets.ru/viewtopic.php?p=6611357#6611357
Таки да, вы.


kostyanet писал(а):Автору: начните не с поиска ответа, а с вопроса самому себе - в какое место этого кода вам нужно воткнуть имя _вашего_ екзешника.

Автор, в лучших традициях, жжот.

"КАК?" - родится вопрос у автора.

Что делать, поясним и в третий раз: постить в топик ответ, давно находящийся в нём - тупо.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 11.06.2006 (Вс) 19:01

Народ, хватит ругаться :?
А ссылки по теме на внешние ресурсы пусть будут: никому они не мешают, а пригодиться могут (готовые классы, модули и т.д.)
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.06.2006 (Вт) 7:26

VVitafresh писал(а):а пригодиться могут (готовые классы, модули и т.д.)


Готовые классы... А я вот думаю - а нафига в Help-е описана StdOut Property, причем с примером ;)

Ну и там всякие StdIn, StdErr...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

dimix
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 174
Зарегистрирован: 08.02.2005 (Вт) 22:47

Сообщение dimix » 05.07.2006 (Ср) 14:47

Автору: начните не с поиска ответа, а с вопроса самому себе - в какое место этого кода вам нужно воткнуть имя _вашего_ екзешника.


Ну я автор. Кто сказал, что мне нужно задаваться этим вопросом? Я уже полтора года назад во всем разобрался, еще раз спасибо GSerg'у. kostyanet, конкретизируйте, к кому обращаетесь.

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 28.07.2007 (Сб) 3:23

Неохото создавать новую тему, чтобы небыло лишних вопросов...

А как быть если необходимо обрабатывать все данные выводимые в консоли, не затрагивая самой консоли, - не изменяя stdOutput на свой ?

Сабклассить ?- и/или что тогда сабклассить - выходной буфер?
No comments ...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.07.2007 (Сб) 11:25

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 28.07.2007 (Сб) 16:37

Код: Выделить всё
Private Declare Function ReadConsoleOutput Lib "kernel32.dll" Alias "ReadConsoleOutputA" (ByVal hConsoleOutput As Long, ByRef lpBuffer As CHAR_INFO, ByRef dwBufferSize As COORD, ByRef dwBufferCoord As COORD, ByRef lpReadRegion As SMALL_RECT) As Long
С консолью, через AllocConsole созданной - это все конечно работает и понятно почему, потому что получить хендл буфера вывода можно просто и элементарно GetStdHandle

Но как быть с чужой консолью, у которой мне известен только хендл этой консоли а ReadConsoleOutput нужен
Код: Выделить всё
hConsoleOutput
[in] A handle to the console screen buffer. The handle must have the GENERIC_WRITE access right. For more information, see Console Buffer Security and Access Rights.
No comments ...

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, SemrushBot и гости: 35

    TopList