Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: www.lirc.narod.ru
 Профиль | | #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
Когдато делал эмулятор командной строки, думаю тебе поможет

Option Explicit
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
Хочу так же обратить внимание на Trim(), который съедает пробенлы в конце.

В начале тоже :)

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 01.06.05 22:06
т.е. запускаю я прогу через твой эмулятор, когда она что-то спрашует, это появляется в текстбоксе, и я ей отправляю команду... ism свяжись с сомнйо по асе, 334479038 поговорить надо, просто не хочу кое что на форуме обсуждать...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам