Страница: 1 | 2 |
Вопрос: VB6 и командная строка
Добавлено: 04.12.06 05:20
Автор вопроса: Viktor Petrov
Здравствуйте, господа!
Имею необходимость использовать из своих приложений одну утилитку командной строки. Делаю, например, так:
Получаю в командной строке некий результат, например
<table>
<tr><td>File Name</td><td>1.CR2</td></tr>
<tr><td>Camera Model Name</td><td>Canon EOS 350D DIGITAL</td></tr>
<tr><td>Date/Time Original</td><td>2006:10:11 17:01:46</td></tr>
<tr><td>Shooting Mode</td><td>Aperture-priority AE</td></tr>
<tr><td>Shutter Speed</td><td>1/80</td></tr>
<tr><td>Aperture</td><td>5.6</td></tr>
<tr><td>Metering Mode</td><td>Evaluative</td></tr>
<tr><td>Exposure Compensation</td><td>+2/3</td></tr>
<tr><td>ISO</td><td>100</td></tr>
<tr><td>Lens</td><td>18.0 - 55.0mm</td></tr>
<tr><td>Focal Length</td><td>31.0mm</td></tr>
<tr><td>Image Size</td><td>1536x1024</td></tr>
<tr><td>Quality</td><td>RAW</td></tr>
<tr><td>Flash</td><td>Off</td></tr>
<tr><td>White Balance</td><td>Auto</td></tr>
<tr><td>Focus Mode</td><td>One-shot AF</td></tr>
<tr><td>Contrast</td><td>+1</td></tr>
<tr><td>Sharpness</td><td>+1</td></tr>
<tr><td>Saturation</td><td>+1</td></tr>
<tr><td>Color Tone</td><td>Normal</td></tr>
<tr><td>File Size</td><td>7 MB</td></tr>
<tr><td>File Number</td><td>149-4996</td></tr>
<tr><td>Drive Mode</td><td>Single-frame shooting</td></tr>
<tr><td>Owner's Name</td><td>unknown</td></tr>
<tr><td>Camera Body No.</td><td>0930647597</td></tr>
</table>
Вопрос, собственно, в том, как этот результат импортировать в мое приложение VB6...
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
JMP
Вопросов: 6
Ответов: 171
Профиль | | #1
Добавлено: 04.12.06 06:55
Shell "exiftool -h -canon 1.CR2 >Report.txt"
И из VB открывать файл "Report.txt"
Номер ответа: 2
Автор ответа:
Albert
ICQ: 334-970-670
Вопросов: 14
Ответов: 20
Профиль | | #2
Добавлено: 04.12.06 10:14
Слушайте, я вот тоже хотел задать вопрос по поводу командной строки... вот команда
Shell "exiftool -h -canon 1.CR2"
полностью равноценна команде в сеансе MS DOS
C:\>exiftool -h -canon 1.CR2
да? или я ошибаюсь? просто из начально у меня был вопрос как передать командной строке каманду на выполнение
Номер ответа: 3
Автор ответа:
Viktor Petrov
Вопросов: 12
Ответов: 27
Профиль | | #3
Добавлено: 04.12.06 11:15
И из VB открывать файл "Report.txt"
Спасибо, о работе с текстовым файлом я думал...
А нет ли более "прямого" способа? Просто утилита и так будет выполняться довольно медленно (большие объемы графики), а тут ее еще дополнительно замедлять...
Номер ответа: 4
Автор ответа:
Viktor Petrov
Вопросов: 12
Ответов: 27
Профиль | | #4
Добавлено: 04.12.06 11:18
Shell "exiftool -h -canon 1.CR2"
полностью равноценна команде в сеансе MS DOS
C:\>exiftool -h -canon 1.CR2
да? или я ошибаюсь? просто из начально у меня был вопрос как передать командной строке каманду на выполнение
Ошибаетесь, видимо. Моя команда запускает файл exiftools.exe в папке с программой, а не на диске С.
Ну а так, конечно, МС ДОС и командная строка Винды, по понятным причинам, похожи...
Номер ответа: 5
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #5
Добавлено: 04.12.06 12:17
Более прямой способ - создать пайпы и назначить их хандлы в качестве stdin и stdout в структуре, передаваемой CreateProcess.
http://www.wasm.ru/print.php?article=1001021
http://www.codenet.ru/progr/bcb/pipes.php
Номер ответа: 6
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #6
Добавлено: 04.12.06 13:01
ты не в nix'e, такого серфинга ты не получишь.
Номер ответа: 7
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #7
Добавлено: 04.12.06 16:54
Да ну прям Причем тут никсы Пост 5 - пайпы, пост 7 - реализ.
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
'конвертируем строку в win-кодировку.
Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" _
 ByVal lpszSrc As String, ByVal lpszDst As String) 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
Public Sub initDos() 'Ф-ция инцелизации, вызывать в самом начале обязательно!
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
Public Function dosShell(StrCmd As String) As String
Dim dwBuff As Long
Dim buff As String * 4096
Dim cmd As String * 1024
Dim result As String
'выполнение команды
cmd = vbNullString
cmd = RTrim(StrCmd) & 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)
result = result & RTrim(buff)
If (Right(RTrim(buff), 1) = ">" Then Exit Do
buff = vbNullString
Loop While (dwBuff <> 0)
'конвертирование результата в WIN кодировку
Dim sourcestring As String ' нужная строка
Dim deststring As String ' получаемая строка
Dim code As Long
deststring = Space$(Len(result)) 'получаем перекодированную строку
code = OemToChar(result, deststring)
dosShell = deststring
End Function
Номер ответа: 8
Автор ответа:
Alex Z
Вопросов: 0
Ответов: 3
Профиль | | #8
Добавлено: 05.12.06 03:43
Сорри за ламерство, а нельзя ли чуть поподробнее в смысле адаптации примера к использованию с какой-нибудь заданной командой. А то не совсем понял, куда чего подставлять.
Номер ответа: 9
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #9
Добавлено: 05.12.06 12:43
всю канитель пихаешь в модуль...
на форме
Call initDos
End Sub
Потом когда надо выполнить команду в cmd, пишешь...
Dim s$
s = dosShell ("dir"
и в переменной s$ будет тебе то, что выдаст cmd.
Номер ответа: 10
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #10
Добавлено: 05.12.06 22:52
s = dosShell ("dir"
Номер ответа: 11
Автор ответа:
Viktor Petrov
Вопросов: 12
Ответов: 27
Профиль | | #11
Добавлено: 06.12.06 04:28
Огромное спасибо всем откликнувшимся, особенно
HACKER'у и Sharp'у!
Номер ответа: 12
Автор ответа:
Alex Z
Вопросов: 0
Ответов: 3
Профиль | | #12
Добавлено: 11.12.06 04:13
Еще вопрос - использование данного модуля вызывает процесс cmd.exe. Как его лучше потом "убить"?
Номер ответа: 13
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #13
Добавлено: 11.12.06 08:31
А ты в свойствах проги поставь "Закрывать окно по завершении работы". У меня таким макаром усе работает года 3.
Номер ответа: 14
Автор ответа:
Alex Z
Вопросов: 0
Ответов: 3
Профиль | | #14
Добавлено: 11.12.06 11:48
По-моему, это немного не то...
Дело в том, что cmd.exe - это сторонняя (виндовская) утилита, и ее работа никак не зависит от состояния запустившей ее проги. К тому же, в ходе выполнения проги мне приходится обращаться к данному модулю много раз, и какждый раз запускается новый процесс cmd.exe - т.е. к концу работы моей проги имеется МНОГО процессов cmd.exe
Т.Е. задача в том, чтобы вырубать упомянутый процесс сразу по завершении работы модуля.
Номер ответа: 15
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #15
Добавлено: 11.12.06 12:01
В том то и дело: cmd - это шелл, наподобия никсового(только более ограниченный). Моя прога, работа с БД, печатает из-под ДОС, для чего вызывает досовскую прогу на QB. Т.е. я передаю параметры из VB6 в QB, она печатает кирилицу и закрывается. CMD закрывается вместе с ней. на старом компе (166 вроде) на это дело уходит 3-4 секунды.