Запуск екзешника

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Запуск екзешника

Сообщение Хакер » 18.11.2009 (Ср) 16:21

KPEATOP писал(а):Если без батника, то как мне перенаправить вывод екзешника в файл. Я это и пытаюсь узнать. Подскажите как это сделать.

Можно либо самому это сделать, либо заставить это делать того, кто это уже умеет.

Соответственно:
  • Быдло-вариант:
    Код: Выделить всё
    Shell "cmd /c aaaaaa > bbbbbb
  • Гуру-вариант:
    Указать в STARTINFO-структуре в качестве hStdout хендл файла (если надо в фале) или пайпа (если просто получить себе), не забыв установить флаг, что ты подменяешь стандартные хендлы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Запуск екзешника

Сообщение Twister » 18.11.2009 (Ср) 22:46

Нет, на этом форуме со времен GSerg'а новичкам не помогают ;)
А я все практикую лечение травами...

KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Re: Запуск екзешника

Сообщение KPEATOP » 19.11.2009 (Чт) 10:44

В архиве 3 файла (GRAD1.bat, GRAD1.exe, WWOD.dat). В файле WWOD.dat исходные данные (не меняйте ничего там). Разместите эти файлы где угодно. Можете проверить, программа работает (запускаете GRAD1.bat и после недолгой работы создается файл GRAD1.res).
Кто подскажет как запустить програмно эту программу, чтоб появился файл с результатми GRAD1.res (у меня нет прав администратора и соответственно доступа к папке C:\Program Files, поэтому мне нужно чтоб файл GRAD1.res появлялся где нибудь в другом месте).

Пробовал:
ProgShel = Shell("C:\1\grad1.bat", vbNormalFocus)
не работает GRAD1.res не появляется
Вложения
1.rar
(31.29 Кб) Скачиваний: 45
Вечность пахнет нефтью

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Запуск екзешника

Сообщение awl100Alex » 19.11.2009 (Чт) 11:28

Вот так...
Код: Выделить всё
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1

Private Sub Form_Load()
    ShellExecute 0&, vbNullString, "GRAD1.exe", _
    ">GRAD1.res", "C:\Program Files\NGDU\", SW_SHOWNORMAL
End Sub

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

Re: Запуск екзешника

Сообщение alibek » 19.11.2009 (Чт) 16:23

Не так.
Lasciate ogni speranza, voi ch'entrate.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Запуск екзешника

Сообщение awl100Alex » 19.11.2009 (Чт) 22:53

alibek писал(а):Не так.

??? :shock: !!!.. :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Запуск екзешника

Сообщение Хакер » 19.11.2009 (Чт) 23:10

Добро пожаловать в мир суровой реальности.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Re: Запуск екзешника

Сообщение HiSER » 28.11.2009 (Сб) 3:41

Вот так... :)
Код: Выделить всё
Private Const STARTF_USESTDHANDLES = &H100
Private Const GENERIC_WRITE = &H40000000
Private Const INVALID_HANDLE_VALUE = -1
Private Const CREATE_ALWAYS = 2

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 Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessId As Long
        dwThreadId As Long
End Type

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (lpApplicationName As Any, 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, ByVal lpFileSizeHigh As Long) As Long

Private Sub Command1_Click()
Dim si As STARTUPINFO
Dim pi As PROCESS_INFORMATION
Dim sa As SECURITY_ATTRIBUTES
ChDir "C:\1\"
sa.bInheritHandle = 1
sa.nLength = Len(sa)
si.cb = Len(si)
si.dwFlags = STARTF_USESTDHANDLES
si.hStdInput = INVALID_HANDLE_VALUE
si.hStdError = INVALID_HANDLE_VALUE
si.hStdOutput = CreateFile("GRAD1.res", GENERIC_WRITE, 0, sa, CREATE_ALWAYS, 0, 0)
CreateProcess ByVal 0&, "GRAD1.exe", ByVal 0&, ByVal 0&, 1, 0, ByVal 0&, vbNullString, si, pi
Do Until WaitForSingleObject(pi.hProcess, 500) = 0
Me.Caption = "Processed: " & GetFileSize(si.hStdOutput, 0) & " bytes"
Loop
Me.Caption = "Finish: " & GetFileSize(si.hStdOutput, 0) & " bytes"
CloseHandle pi.hThread
CloseHandle pi.hProcess
CloseHandle si.hStdOutput
End Sub

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Re: Запуск екзешника

Сообщение Wolfie » 29.11.2009 (Вс) 2:09

Хакер писал(а):...Можно либо самому это сделать, либо заставить это делать того, кто это уже умеет.

Соответственно:
  • Быдло-вариант:
    Код: Выделить всё
    Shell "cmd /c aaaaaa > bbbbbb
  • Гуру-вариант:
    Указать в STARTINFO-структуре в качестве hStdout хендл файла (если надо в фале) или пайпа (если просто получить себе), не забыв установить флаг, что ты подменяешь стандартные хендлы.


Ну во-первых не быдло-вариант, а просто простой (а кроме уровней "быдло" и "гуру" других нет чтоли в хакер-спецификации :mrgreen: )
и думается что его пока что КРЕАТОРу хватит.

А во-вторых, если по полочкам -
1. удалить и забыть файл GRAD1.bat
почему? потому что он делает то, что сможет сделать программа напрямую, это пытались объяснить в предыдущих постах, но не вышло
2. написать в своей программе команду смены каталога (а если надо - то кроме нее еще и смены диска) на каталог программы GRAD1.exe,в котороми лежит WWOD.DAT (иначе GRAD не находит этот файл и ничего не делает)
3. написать в своей программе команду вызова внешней программы, в которой вызвать консоль CMD, передав ей в качестве коммандной строки запрос на исполнение GRAD1.EXE с выводом в нужный тебе каталог и файл.

выглядеть будет так
Код: Выделить всё
ChDir "Путь-к-GRAD1.exe"
Shell "cmd /с GRAD1.exe >Путь-для-вывода\файл.res", vbHide

в качестве пути для вывода неплохо подойдет рабочий стол, например %USERPROFILE%\Рабочий стол\RESULT.res

P.S. вообще, компИлировать экзешник ради этих двух строк кода неэтично) можно просто изменить BAT -
вписать туда желаемый путь для вывода или даже запрос на введение пути etc.

[Viper] :: Ну сколько можно писать слово "компилировать" через Е? Банить что ли за это начинать?
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

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

Re: Запуск екзешника

Сообщение Andrey Fedorov » 29.11.2009 (Вс) 3:36

KPEATOP писал(а):Поищу конечно! Мне CreateProcess ни о чем не говорит. Я думал, что здесь новичкам в VB тоже помогают.
Ладно поищу, спасибо!


Совет, кстати, абсолютно правильный - вам дали ключевое слово по которому надо поискать и поизучать как в конференции/интернете, так и просто в Help-e. Параметры CreateProcess позволяют перназначить вывод в STDOUT туда куда вам нужно. Примеры находятся достаточно легко. Или вы хотите чтобы за вас написали всю программу?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Запуск екзешника

Сообщение Nord777 » 29.11.2009 (Вс) 12:03

Общий смысл этой темы:

Вопрошающий: Ребят, у меня в моём запорожце барахлит временами карбюратор. Подскажите, как настроить правильно?
Отвечающие(хором): Запорожец - это отстой, купи себе мерседес - это круче.
:)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

Re: Запуск екзешника

Сообщение Andrey Fedorov » 29.11.2009 (Вс) 13:56

Держите простейший пример без CreateProcess...

Код: Выделить всё
Option Explicit

Public Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long

Public Sub Main()
    Dim iExitCode As Long, sStdOut As String, sStdErr As String
   
    iExitCode = RunFile("CScript /?", sStdOut, sStdErr)

    Debug.Print
    Debug.Print "ExitCode = " & iExitCode
    If Len(sStdOut) Then Debug.Print "========= StdOut ==========" & vbCrLf & sStdOut
    If Len(sStdErr) Then Debug.Print "========= StdErr ==========" & vbCrLf & sStdErr
End Sub

Public Function RunFile(sFile As String, sStdOut As String, sStdErr As String) As Long
    Dim oShell As Object    ' IWshRuntimeLibrary.WshShell
    Dim oExec As Object     ' IWshRuntimeLibrary.WshExec
   
    Set oShell = CreateObject("WScript.Shell")

    Set oExec = oShell.Exec(sFile)

    RunFile = oExec.ExitCode
    If Not oExec.StdOut.AtEndOfStream Then
        sStdOut = oExec.StdOut.ReadAll
        OemToChar sStdOut, sStdOut
    End If

     If Not oExec.StdErr.AtEndOfStream Then
          sStdErr = oExec.StdErr.ReadAll
          OemToChar sStdErr, sStdErr
     End If
End Function


P.S
Но с CreateProcess можно сделать покруче - к примеру сделать консольное окно невидимым...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Re: Запуск екзешника

Сообщение Wolfie » 01.12.2009 (Вт) 5:06

2 Viper
тяжелый день? :lol:
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Пред.

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

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

Сейчас этот форум просматривают: Google-бот и гости: 8

    TopList