Страница: 1 |
Страница: 1 |
Вопрос: Программу в cmd заставить что то сделать
Добавлено: 29.05.05 02:11
Автор вопроса: HACKER
От такой непонятный вопрос:
Вот запустил я прогу в cmd. Прога работает, потом что то спросила... (запрос на ввод команды) как мне ей программно передать эту команду? Спокуха :) щас поясню... К примеру прога 1.exe Запускаем ещё в cmd, она там что-то делает, что то пишет неважно... Потом она что-то спрашивает, мы вводим, и прога работает дальше. Нужно ввести ей эти данные. Думал bat файлом...
--------------
1.exe
peredali
--------------
Т.е. запустили 1.exe, 1.exe что то спросил, на запрос ответели "peredali". Но не получилось! Запускается 1.exe, пофиг что он делает, спрашует или не спрашует, НО ТОЛЬКО ПОСЛЕ ЗАВЕРШЕНИЯ 1.EXE cmd пытается выполнить команду "peredali", а надо чтоб на запрос программы мы что-то ответели...
P.S. Нажимать программно на клаву не предлагать :)
Есть идеи?
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #1
Добавлено: 29.05.05 07:54
Сначала CreatePipe - одну для StdIn, другую для StdOut (а StdErr тебе не нужен, как я понял). Потом CreateProcess с указанием хэндлов этих пайпов в качестве StdIn и StdOut нового процесса. Потом по таймеру ReadFile пайп StdOut, и если там чё-то появилось, значит, прога чё-то спросила, и тогда WriteFile в StdOut...
Номер ответа: 2
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #2
Добавлено: 29.05.05 08:00
WriteFile в StdIn, конечно же...
Номер ответа: 3
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #3
Добавлено: 29.05.05 16:51
мда, я мало что понял. Можно хоть не сложный примерчик? Или описание всех функций что ты написал (msdn не предлагать )))
Номер ответа: 4
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #4
Добавлено: 29.05.05 17:57
Предлагаю API-Guide.
В хелпе по CreatePipe там пример.
Номер ответа: 5
Автор ответа:
Илья
ICQ: 251647191
Вопросов: 37
Ответов: 167
Web-сайт:
Профиль | | #5
Добавлено: 29.05.05 19:41
Небольшой пример:
dir c:\windows < c:\1.txt
Заставляет прогу брать команды из файла C:\1.txt
Номер ответа: 6
Автор ответа:
Genetik
ICQ: 3212009
Вопросов: 5
Ответов: 33
Профиль | | #6
Добавлено: 30.05.05 00:27
Если я правильно понял, то есть примерчик передачи строки в другую программу. Только надо заранее открыть ету прогу(пример с блокнотом).
Private Sub Command1_Click()
AppActivate("Беземянный"
SendKeys("Привет из VB!!!"
End Sub
Номер ответа: 7
Автор ответа:
ism
ICQ: 237575486
Вопросов: 5
Ответов: 4
Профиль | | #7
Добавлено: 30.05.05 03:10
Когдато делал эмулятор командной строки, думаю тебе поможет
Private Type PIPE
hRead As Long
hWrite As Long
End Type
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
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 Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
lpApplicationName As String, ByVal lpCommandLine As String, ByVal _
lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As String, _
lpStartupInfo As STARTUPINFO, lpProcessInformation As _
PROCESS_INFORMATION) 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 WriteFile 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 Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Const STARTF_USESHOWWINDOW = &H1
Private Const SW_HIDE = 0
Private Const STARTF_USESTDHANDLES = &H100
Private input1 As PIPE
Private output1 As PIPE
Private pi As PROCESS_INFORMATION
Private Sub init()
Dim sa As SECURITY_ATTRIBUTES
Dim si As STARTUPINFO
sa.nLength = Len(sa)
sa.bInheritHandle = 1
sa.lpSecurityDescriptor = 0
Call CreatePipe(input1.hRead, input1.hWrite, sa, 0)
Call CreatePipe(output1.hRead, output1.hWrite, sa, 0)
si.cb = Len(si)
si.dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
si.wShowWindow = SW_HIDE
si.hStdInput = input1.hRead
si.hStdOutput = output1.hWrite
si.hStdError = output1.hWrite
Call CreateProcessA(vbNullString, "CMD.exe", 0&, 0&, 1&, _
0, 0&, vbNullString, si, pi)
End Sub
Private Sub Command1_Click()
Dim dwBuff As Long
Dim buff As String * 4096
Dim cmd As String * 1024
cmd = vbNullString
cmd = InputBox("Команда"
cmd = RTrim(cmd) & vbCrLf
Call WriteFile(input1.hWrite, cmd, Len(cmd), dwBuff, ByVal 0&
Sleep (500)
Do
Call ReadFile(output1.hRead, buff, 4096, dwBuff, ByVal 0&
buff = Left(buff, dwBuff)
Text1.Text = Text1.Text & RTrim(buff)
If (Right(RTrim(buff), 1) = ">" Then Exit Do
buff = vbNullString
Loop While (dwBuff <> 0)
End Sub
Private Sub Form_Load()
Dim dwBuff As Long
Dim buff As String * 4096
Dim cmd As String * 1024
init
Sleep (500)
Call ReadFile(output1.hRead, buff, 4096, dwBuff, ByVal 0&
Text1.Text = RTrim(buff)
End Sub
Номер ответа: 8
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #8
Добавлено: 30.05.05 05:22
2 ism расскажи как протестить твой код
Номер ответа: 9
Автор ответа:
Black Dragon
ICQ: 321186096
Вопросов: 30
Ответов: 347
Web-сайт:
Профиль | | #9
Добавлено: 30.05.05 20:21
Простите за флуд
2Genetik: прочитай книжку по грамматике русского языка!
Номер ответа: 10
Автор ответа:
ism
ICQ: 237575486
Вопросов: 5
Ответов: 4
Профиль | | #10
Добавлено: 31.05.05 01:29
Я делал на форме текстбокс и комманд батон. Кликаеш и в инпутбоксе вводишь команду (н-р Dir), в текстбоксе ответ. Можно чуть переделать и работать как с терминалом.
Хочу так же обратить внимание на Trim(), который съедает пробенлы в конце.
Номер ответа: 11
Автор ответа:
Black Dragon
ICQ: 321186096
Вопросов: 30
Ответов: 347
Web-сайт:
Профиль | | #11
Добавлено: 31.05.05 20:19
В начале тоже
Номер ответа: 12
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #12
Добавлено: 01.06.05 22:06
т.е. запускаю я прогу через твой эмулятор, когда она что-то спрашует, это появляется в текстбоксе, и я ей отправляю команду... ism свяжись с сомнйо по асе, 334479038 поговорить надо, просто не хочу кое что на форуме обсуждать...