управление ДОС приложением

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

управление ДОС приложением

Сообщение Skarobey » 06.07.2005 (Ср) 21:35

есть дос приложение (в окне винды)
как передавать туда команды? скажем нажатие клавишь.

или где почитать про это?

также как оттуда(из дос) вытащить данные?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 06.07.2005 (Ср) 22:03

2) Скажем, тебе надо вытащить в текстовый файл результаты использования команды dir. Вот мой ламерский способ:
Код: Выделить всё
Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliSeconds&)

Private Sub Form_Load()
Open "C:\-1234.bat" For Output As #1
Print #1, "@echo off"
Print #1, "@dir /a /o /4 > C:\-1234.txt"
Close #1
Shell "C:\-1234.bat", vbHide
Sleep 500
Open "C:\-1234.txt" For Input As #1
MsgBox Input(LOF(1), #1)
Close #1
End Sub

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 06.07.2005 (Ср) 22:15

A.A.Z будем разбираться...=)

нашел нечто похожее, исходник уопилота=))) но он на делфи=(...
мож кто поспитрит на дасуге =] из знающих...
Вложения
UoPilot.zip
(101.49 Кб) Скачиваний: 94

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

Сообщение GSerg » 07.07.2005 (Чт) 6:10

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

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 07.07.2005 (Чт) 18:50

2 Skarobey: http://www.mentalis.org/apilist/CreatePipe.shtml
2 GSerg: Зато... Зато мой код понятнее и меньше :lol:

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 08.07.2005 (Пт) 9:47

полазил что-то для себя откапал...
только не понял как подключаться к рабочему процессу :roll:

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

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 "Cannot run Crafty!", vbCritical
Unload Me
End If
End Sub

а вот как именно уже к рабочему окну подключится?

з.ы.
я нууб=)

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 08.07.2005 (Пт) 10:15

покапался немного....
правильно ли я мыслю (пока тока мыслю т.к. ночь над этим гемороился=)

если я использую OpenProcess , там есть PROCESS_VM_READ и PROCESS_VM_WRITE , можно этим пользоватся для связи с дос окном? или всеже как-то через pipe?

или я чего-то не понимаю?=)

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

Сообщение GSerg » 08.07.2005 (Пт) 11:21

Интересно, как это можно подменить StdIn запущенного процесса :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 08.07.2005 (Пт) 11:44

GSerg писал(а):Интересно, как это можно подменить StdIn запущенного процесса :)

Чесслово, можно. В WinNT я даже выдел, по какому адресу менять хэндл :-)
Изображение

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

Сообщение GSerg » 08.07.2005 (Пт) 12:38

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

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

Сообщение tyomitch » 08.07.2005 (Пт) 13:47

GSerg писал(а):И что, этот адрес будет в следующем году на том же месте? :)

Точно-точно. Соответствующие структуры объявлены в NTDDK (т.е. публика имеет право с ними компилироваться).
Изображение

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 11.07.2005 (Пн) 8:19

ааааааа народ ну помогиде, никак не могу...

вот из справочника ... как мне вместо
If CreateProcess(vbNullString, cmdLine, pra, tra, True, 0, Null, vbNullString, sui, pi) <> 0 Then

открыть приложение , зная procID и hwnd приложения что надо открыть.... уже 2-3 суток мучаюсь а в итоге какие-то счетчики получаются....ррррррррррррр



Option Explicit
Private Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
Private Declare Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoA" (lpStartupInfo As STARTUPINFO)
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

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 Type OVERLAPPED
ternal As Long
ternalHigh As Long
offset As Long
OffsetHigh As Long
hEvent As Long
End Type

Private Const STARTF_USESHOWWINDOW = &H1
Private Const STARTF_USESTDHANDLES = &H100
Private Const SW_HIDE = 0
Private Const EM_SETSEL = &HB1
Private Const EM_REPLACESEL = &HC2

Private Sub Command1_Click()
Command1.Enabled = False
Redirect Text1.Text, Text2
Command1.Enabled = True
End Sub
Private Sub Form_Load()
Text1.Text = "ping"
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If Command1.Enabled = False Then Cancel = True
End Sub

Sub Redirect(cmdLine As String, objTarget As Object)
Dim i%, t$
Dim pa As SECURITY_ATTRIBUTES
Dim pra As SECURITY_ATTRIBUTES
Dim tra As SECURITY_ATTRIBUTES
Dim pi As PROCESS_INFORMATION
Dim sui As STARTUPINFO
Dim hRead As Long
Dim hWrite As Long
Dim bRead As Long
Dim lpBuffer(1024) As Byte
pa.nLength = Len(pa)
pa.lpSecurityDescriptor = 0
pa.bInheritHandle = True

pra.nLength = Len(pra)
tra.nLength = Len(tra)

If CreatePipe(hRead, hWrite, pa, 0) <> 0 Then
sui.cb = Len(sui)
GetStartupInfo sui
sui.hStdOutput = hWrite
sui.hStdError = hWrite
sui.dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
sui.wShowWindow = SW_HIDE
If CreateProcess(vbNullString, cmdLine, pra, tra, True, 0, Null, vbNullString, sui, pi) <> 0 Then
SetWindowText objTarget.hwnd, ""
Do
Erase lpBuffer()
If ReadFile(hRead, lpBuffer(0), 1023, bRead, ByVal 0&) Then
SendMessage objTarget.hwnd, EM_SETSEL, -1, 0
SendMessage objTarget.hwnd, EM_REPLACESEL, False, lpBuffer(0)
DoEvents
Else
CloseHandle pi.hThread
CloseHandle pi.hProcess
Exit Do
End If
CloseHandle hWrite
Loop
CloseHandle hRead
End If
End If
End Sub

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 12.07.2005 (Вт) 5:24

дело в том что процесс идет в этом приложении... и мне надо вытащить этот поток и анализировать. скажем кто-то рубится в КС, и в это время надо вытащить из этого процессы все=)

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

Сообщение GSerg » 12.07.2005 (Вт) 7:34

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

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 12.07.2005 (Вт) 9:24

ну вобщем как заглянуть в процесс?
посмотреть че там происходит

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

Сообщение GSerg » 12.07.2005 (Вт) 10:47

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

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 12.07.2005 (Вт) 12:25

GSerg писал(а):http://bbs.vbstreets.ru/viewtopic.php?p=136146#136146

Ссылка топика на себя :D :D :D
Ржу не могу лол
Если всё делать своими ручками, они скоро отвалятся !

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

Сообщение alibek » 12.07.2005 (Вт) 12:36

Это ерунда :)
Так - круче :)
http://bbs.vbstreets.ru/viewtopic.php?p=136208#136208
Lasciate ogni speranza, voi ch'entrate.

Skarobey
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 01.06.2002 (Сб) 17:34
Откуда: Russia

Сообщение Skarobey » 12.07.2005 (Вт) 14:33

хватит глумиться... я тут в канвульсиях весь... а они прикалываются

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

Сообщение alibek » 12.07.2005 (Вт) 14:35

Skarobey писал(а):хватит глумиться... я тут в канвульсиях весь... а они прикалываются

Завис? :)
Ничего, скоро экцепшн будет :)
Lasciate ogni speranza, voi ch'entrate.


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

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

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

    TopList