Как получить ответ от DOS программы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
woller
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 03.09.2004 (Пт) 7:47

Как получить ответ от DOS программы

Сообщение woller » 20.09.2004 (Пн) 9:09

в BAT-файле пишу так:
DIAL.EXE connect provider
if errorlevel=1 goto nocon

А как написать то же на VB, отловить сообщение об ошибке?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 20.09.2004 (Пн) 10:32

Эээ. Это тебе надо запускать задачу через CreateProcess(), чтобы он тебе вернул указатель на процесс. А потом, через GetExitCodeProcess() (кажется так) ты получишь тот самый еррор-левел. Поищи в MSDN пример по использованию CreateProcess() - он там был, я в свое время на его основе написал утилиту для регистрации ActiveX-компонентов с внутренним вызовом regsvr32 и ожиданием его завершения.

bonch
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 17.09.2002 (Вт) 12:24
Откуда: Moldova

Сообщение bonch » 20.09.2004 (Пн) 11:08

Я в таких случаях запускаю DOS прогу так:
doscommand.exe > с:\doscomand.log
Т.е. результат ее выполнения пишу в файл.
Затем его обрабатываю и удаляю.


Всё гениальное в простынь. :lol:
Последний раз редактировалось bonch 20.09.2004 (Пн) 14:57, всего редактировалось 1 раз.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 20.09.2004 (Пн) 11:33

написал утилиту для регистрации ActiveX-компонентов с внутренним вызовом regsvr32 и ожиданием его завершения.


А у меня это дело так вызывается:

Код: Выделить всё
'*************************************************************
' Регистрирует/дерегистрирует указанный файл
'*************************************************************
Public Function RegSvr(sFileName As String, Optional bRegister As Boolean = False) As Long
    Const ERR_CANT_LOAD = 4&
    Const ERR_NO_ENTRY_POINT = 5&
    Const ERR_CANT_REGISTER = 6&
   
    Dim lb As Long, pa As Long, s As String, ss As String
    If g_bWin98 Or g_bWinNT4 Then
        s = GetSystemDirectory
        If Not bRegister Then ss = "/u "
        If StartFile(s & "RegSvr32.exe /s " & ss & sFileName) Then RegSvr = ERR_CANT_REGISTER
    Else
        lb = LoadLibrary(sFileName)
        If lb Then
            s = IIf(bRegister, "DllRegisterServer", "DllUnregisterServer")
            pa = GetProcAddress(lb, s)
            If pa Then
                If CallWindowProc(pa, ByVal 0&, ByVal 0&, ByVal 0&, ByVal 0&) Then RegSvr = ERR_CANT_REGISTER
            Else
                RegSvr = ERR_NO_ENTRY_POINT
            End If
            FreeLibrary lb
        Else
            RegSvr = ERR_CANT_LOAD
        End If
    End If
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

woller
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 03.09.2004 (Пт) 7:47

Сообщение woller » 20.09.2004 (Пн) 13:47

Выгрузить в лог сообщения это здорово. Проблема дальше, есть у меня старая заготовочка, для ожидания окончания работы программы:
Public Sub WaitForProcessToEnd(cmdLine As String)
Dim retVal As Long, pID As Long, pHandle _
As Long
pID = Shell(cmdLine)
pHandle = OpenProcess(&H100000, True, pID)
Do
retVal = WaitForSingleObject(pHandle, 50)
Loop While retVal <> 0
End Sub
Почему-то Shell() не все командные строки понимает, в частности
"rasdial provider username password"
исполняет, а
"rasdial provider username password >c:\1.log"
проскакивает мимо.
А для использования CreateProcess() нужно какую нибудь библиотечку прицепить? Извините, сфера программирования не совсем моя.

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

Сообщение tyomitch » 20.09.2004 (Пн) 16:00

woller писал(а):А для использования CreateProcess() нужно какую нибудь библиотечку прицепить? Извините, сфера программирования не совсем моя.

Нужно написать в начале модуля:
Код: Выделить всё
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 Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessId As Long
        dwThreadId As Long
End Type
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
Изображение

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

Сообщение alibek » 20.09.2004 (Пн) 16:08

В дополнение скажу, что при таком примере надо обрабатывать строку и убирать все перенаправления ввода/вывода (>c:\log). Для этих целей есть hStdInput, hStdOutput, hStdError (которые можно перенаправить в Pipe, а оттуда в файл или в переменную).
Lasciate ogni speranza, voi ch'entrate.

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

А можно и так *) Кстати по-моему ооочень неплохо 8)))

Сообщение xenomorph » 20.09.2004 (Пн) 21:20

... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...


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

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

Сейчас этот форум просматривают: С.Т., SemrushBot, Yandex-бот и гости: 3

    TopList