как встроить консоль в форму?

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

как встроить консоль в форму?

Сообщение Floyd » 24.04.2009 (Пт) 11:21

Здравствуйте!
Всё что нашел поиском - как открыть "рядом" с формой консоль...
Задача:на форме должно быть окшко с консолью для ввода комманд и отлов того что пишет сервер.
это окошко должно быть небольшим, с мелким ширфтом.
как лучше сделать?
у меня по ходу мыслей возникает 2 варианта:
а) как-то (не знаю как) встроить консоль в форму, изменить в ней шрифт до 7го размера (тоже не знаю возможно ли)
б) встроить в форму эмуляцию консоли, а сама консоль, комманды ввода, и ответы сервера в фоновом режиме отлавливать и помещать
в мой текстбокс.
Спасибо за помощь.

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: как встроить консоль в форму?

Сообщение Xcode » 24.04.2009 (Пт) 11:33


jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: как встроить консоль в форму?

Сообщение jangle » 24.04.2009 (Пт) 13:36

Floyd писал(а):Здравствуйте!
Всё что нашел поиском - как открыть "рядом" с формой консоль...
Задача:на форме должно быть окшко с консолью для ввода комманд и отлов того что пишет сервер.
это окошко должно быть небольшим, с мелким ширфтом.
как лучше сделать?
у меня по ходу мыслей возникает 2 варианта:
а) как-то (не знаю как) встроить консоль в форму, изменить в ней шрифт до 7го размера (тоже не знаю возможно ли)


Возможно.

б) встроить в форму эмуляцию консоли, а сама консоль, комманды ввода, и ответы сервера в фоновом режиме отлавливать и помещать
в мой текстбокс.
Спасибо за помощь.


Эта намного проще в реализации.

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: как встроить консоль в форму?

Сообщение Floyd » 27.04.2009 (Пн) 10:35

проще-то понятно, вот что будет грамотнее?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: как встроить консоль в форму?

Сообщение iGrok » 27.04.2009 (Пн) 10:55

Floyd писал(а):проще-то понятно, вот что будет грамотнее?

Тебе ссылку на грамотное решение дали в первом же ответе. Мало?
label:
cli
jmp label

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: как встроить консоль в форму?

Сообщение Floyd » 27.04.2009 (Пн) 14:27

прочитал все темы и ссылки внутри.
везде есть код как запустить прогу и что-то там делать.
у меня задача проще: фоново запустить консоль, отдавать ей свой ввод, забирать с нее вывод.
пробовал копипастить те коды, что есть по ссылкам - как ни плясал, а ответа в тхтОут так и не дождался...
у меня прога будет юзаться на 2к, хп, висте. там что-то сказано про поддержку 98го- оно не нужно. но я не
соображу что нужно удалить.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: как встроить консоль в форму?

Сообщение Viper » 27.04.2009 (Пн) 15:06

Там не удалить, а заменить на свое надо.
Весь мир матрица, а мы в нем потоки байтов!

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: как встроить консоль в форму?

Сообщение Floyd » 27.04.2009 (Пн) 15:18

вы хотите сказать на cmd.exe?

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: как встроить консоль в форму?

Сообщение Xcode » 27.04.2009 (Пн) 15:48

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

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: как встроить консоль в форму?

Сообщение Floyd » 27.04.2009 (Пн) 16:21

посмотрите, если не сложно код?
форма выдается, появляется, но в окне аутпута никаких вообще сообщений.
Код: Выделить всё
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 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

  CloseHandle hChildStdoutRd

  CreatePipe hChildStdinRd, hChildStdinWr, saAttr, 0

  CloseHandle hChildStdinWr

  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, "C:\Windows\System32\cmd.exe", ByVal 0&, ByVal 0&, 1, 0, ByVal 0&, vbNullString, siStartInfo, piProcInfo) <> 0 Then
    MsgBox "ok!", vbCritical
    Else
    MsgBox "fail!", 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

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: как встроить консоль в форму?

Сообщение Xcode » 27.04.2009 (Пн) 16:28

Вот тебе код, просто скопировал с того топика, и заменил запускаемое приложение на cmd.exe:
Код: Выделить всё
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, "cmd.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

Вот его я проверял, все работает. Ничего менять, удалять не надо.

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: как встроить консоль в форму?

Сообщение Floyd » 27.04.2009 (Пн) 17:32

может у меня в форме что-то не так стоит?
не работает :( прям как есть копипастил и сам когда-то менял...
прилагаю форму.

сорри, что задаю ламерские вопросы, сам прогаю на другом языке,
но вот надо сделать одну мелочь. могу что-то упустить совершенно дурацкое...
Вложения
Form1.rar
(2.4 Кб) Скачиваний: 57

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: как встроить консоль в форму?

Сообщение Xcode » 27.04.2009 (Пн) 18:32

Интервал таймера выстави отличный от нуля :wink:

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: как встроить консоль в форму?

Сообщение Floyd » 28.04.2009 (Вт) 12:23

ну просто мегаспасибо! :)
а вот еще вопрос:
почему если меняю cmd.exe на telnet.exe - вывод телнета не показывает?

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: как встроить консоль в форму?

Сообщение Floyd » 12.05.2009 (Вт) 9:13

up! поскажите пожалуйста как сделать интерактивность с telnet, а не с cmd?
спасибо!

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: как встроить консоль в форму?

Сообщение Floyd » 12.05.2009 (Вт) 9:13

up! поскажите пожалуйста как сделать интерактивность с telnet, а не с cmd?
спасибо!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: как встроить консоль в форму?

Сообщение alibek » 12.05.2009 (Вт) 9:16

telnet это особый случай.
Lasciate ogni speranza, voi ch'entrate.

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: как встроить консоль в форму?

Сообщение Floyd » 12.05.2009 (Вт) 12:43

ну а как организовать взаимодействие?

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: как встроить консоль в форму?

Сообщение Floyd » 13.05.2009 (Ср) 13:56

очень жалко, что вопрос остается открытым.


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

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

Сейчас этот форум просматривают: Google-бот и гости: 50

    TopList