Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 | 2 |

 

  Вопрос: VB6 и командная строка Добавлено: 04.12.06 05:20  

Автор вопроса:  Viktor Petrov
Здравствуйте, господа!
Имею необходимость использовать из своих приложений одну утилитку командной строки. Делаю, например, так:
Shell "exiftool -h -canon 1.CR2"


Получаю в командной строке некий результат, например

<!-- 1.CR2 -->
<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
Shell "exiftool -h -canon 1.CR2 >Report.txt"

И из 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-сайт: sharpc.livejournal.com
 Профиль | | #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 - реализ.

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

'конвертируем строку  в 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
всю канитель пихаешь в модуль...

на форме
Private Sub Form_Load()
    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
Dim s$
s = dosShell ("dir";)
красиво :)) примерчик нада себе захапать :D

Ответить

Номер ответа: 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 секунды.

Ответить

Страница: 1 | 2 |

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



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