Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - [решено] запуск приложения с параметром /?

Ответить
Настройки темы
.NET - [решено] запуск приложения с параметром /?

Аватара для RUVATA

Старожил


Сообщения: 301
Благодарности: 16


Конфигурация

Профиль | Отправить PM | Цитировать


Всем доброго времени суток
при помощи
System.Diagnostics.Process.Start
можно запускать\останавливать и управлять процессами...

все ОК, но вот как-бы help по параметрам посмотреть...
параметр /? предоставляет справку в cmd если они у проги имеются...

Visual Studio 2010 //// vb.NET
консольное приложение

мне на определенном этапе необходимо, чтобы открылась вот эта самая справка...

архиватор 7zip прописан в сист.PATH как "7z"

н\п

Код: Выделить весь код
System.Diagnostics.Process.Start("7z","/?")
видно как поверх консоли VS открывается еще одна в ней отображается справка и закрывается (доля секунды)...
как бы задержать вот эту справку?

-------
Одно дело искать сиюминутное решение, другое - искать знания...
вот и думай - что ты ищешь...


Отправлено: 14:13, 24-08-2010

 

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


RUVATA если допустимо что б текст справки выводился не поверх консоли VS, а прямо в ней, то можно и не задерживать вывод.
Для осуществления вывода в консоль VS необходимо будет задействовать средства Win32:
CreatePipe -> Accessing CreateProcess from C# and VB.NET -> ReadFile

Отправлено: 12:57, 25-08-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для RUVATA

Старожил


Сообщения: 301
Благодарности: 16

Профиль | Отправить PM | Цитировать


у меня проблема, или код примера не верен, или какие-то свойства проекта не позволяют так испоьзовать dll

Код: Выделить весь код
<DllImport("kernel32.dll")> _

    Function CreateProcess( _

    ByVal lpApplicationName As String, _

    ByVal lpCommandLine As String, _

    ByVal lpProcessAttributes As IntPtr, _

    ByVal lpThreadAttributes As IntPtr, _

    ByVal bInheritHandles As Boolean, _

    ByVal dwCreationFlags As UInteger, _

    ByVal lpEnvironment As IntPtr, _

    ByVal lpCurrentDirectory As String, _

    ByRef lpStartupInfo As STARTUPINFO, _

    ByRef lpProcessInformation As PROCESS_INFORMATION) As Boolean

    End Function
Че-т никак не пойму... в чем беда

Код: Выделить весь код
<DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True,
    CharSet:=CharSet.Unicode, ExactSpelling:=True,
    CallingConvention:=CallingConvention.StdCall)>
    Public Function MoveFile(
    ByVal src As String,
    ByVal dst As String) As Boolean
    End Function
... без проблем

-------
Одно дело искать сиюминутное решение, другое - искать знания...
вот и думай - что ты ищешь...


Отправлено: 13:53, 25-08-2010 | #3


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


RUVATA, можно воспользовался VB6м вариантом (см. в программе Api Viewer 2004, не забывая что при переходе (VB6 -> VB.NET) Long заменяется на Integer)
Код: Выделить весь код
    Declare Function CreateProcess Lib "kernel32.dll" Alias "CreateProcessA" ( _
        ByVal lpApplicationName As String, _
        ByVal lpCommandLine As String, _
        ByRef lpProcessAttributes As SECURITY_ATTRIBUTES, _
        ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, _
        ByVal bInheritHandles As Integer, _
        ByVal dwCreationFlags As Integer, _
        ByRef lpEnvironment As Integer, _
        ByVal lpCurrentDriectory As String, _
        ByRef lpStartupInfo As STARTUPINFO, _
        ByRef lpProcessInformation As PROCESS_INFORMATION) As Integer

Отправлено: 13:58, 25-08-2010 | #4


Аватара для RUVATA

Старожил


Сообщения: 301
Благодарности: 16

Профиль | Отправить PM | Цитировать


так... я все поправил код работает... и смысл?
Цитата Admiral:
Accessing CreateProcess from C# and VB.NET »
он тупо открывает блокнот... ну по крайней мере выглядит так

-------
Одно дело искать сиюминутное решение, другое - искать знания...
вот и думай - что ты ищешь...


Отправлено: 14:02, 25-08-2010 | #5


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


RUVATA это не готовый по вопросу пример, а пример лишь использования CreateProcess в VB.NET
Для осуществления поставленной задачи нужно последовательно использовать сразу три Win32:
  • CreatePipe
  • CreateProcess
  • ReadFile

Отправлено: 14:07, 25-08-2010 | #6


Аватара для RUVATA

Старожил


Сообщения: 301
Благодарности: 16

Профиль | Отправить PM | Цитировать


ну... как бы... я все равно не понял о чем этот пример, функция CreateProcess это API-шный аналог NET-овского Process.Start ? Зачем?

мамочка...

а вот есть еще такая "фитча" Console.Set(In/Out) занимается перенаправлением ввода\вывода в консоль там никак не замудрить...

проблемма то как раз в том, чтобы найти вывод от "7z" Запущенного Process.Start, и перенаправить его в Console...

не верится что такая "хрень" требует аш 3 функции API... кстати про
Цитата Admiral:
# CreateProcess
# ReadFile »
я вроде понял... а
Цитата Admiral:
CreatePipe »
э-т что за приблуда

сам сейчас копаюсь в закаулках vb.NET все что касает перенаправления ввода\вывода...
есть способы клонировать поток, направить поток, но уже от запущенного процесса...
а в моем случае его надо перенаправить перед его запуском - вот тут тупняк

-------
Одно дело искать сиюминутное решение, другое - искать знания...
вот и думай - что ты ищешь...


Отправлено: 14:57, 25-08-2010 | #7


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


RUVATA кстати там автор поста и спрашивает, зачем вам Win32 вариант. Ответ прост, в своё время был не обнаружен в .NET 1.0 и началось.

CreatePipe как раз и создаёт перед запуском среду для перенаправления потока, вызванного по CreateProcess. Останется только считать его посредством ReadFile
Возможно есть чисто .NET решения, однако при наличии WIN32 тратится на поиски может и не рационально.

Вот пример использования всех трёх функций воедино.

Код: Выделить весь код
    Public Structure SECURITY_ATTRIBUTES
        Public nLength As Integer
        Public lpSecurityDescriptor As Integer
        Public bInheritHandle As Integer
    End Structure

    Declare Function CreatePipe Lib "kernel32.dll" ( _
        ByRef phReadPipe As Integer, _
        ByRef phWritePipe As Integer, _
        ByRef lpPipeAttributes As SECURITY_ATTRIBUTES, _
        ByVal nSize As Integer) As Integer

    Public Structure STARTUPINFO
        Public cb As Integer
        Public lpReserved As Integer
        Public lpDesktop As Integer
        Public lpTitle As Integer
        Public dwX As Integer
        Public dwY As Integer
        Public dwXSize As Integer
        Public dwYSize As Integer
        Public dwXCountChars As Integer
        Public dwYCountChars As Integer
        Public dwFillAttribute As Integer
        Public dwFlags As Integer
        Public wShowWindow As Short
        Public cbReserved2 As Short
        Public lpReserved2 As Integer
        Public hStdInput As Integer
        Public hStdOutput As Integer
        Public hStdError As Integer
    End Structure

    Const STARTF_USESTDHANDLES As Integer = &H100
    Const STARTF_USESHOWWINDOW As Integer = &H1
    Const SW_HIDE As Integer = 0

    Public Structure PROCESS_INFORMATION
        Public hProcess As Integer
        Public hThread As Integer
        Public dwProcessId As Integer
        Public dwThreadId As Integer
    End Structure

    Declare Function CreateProcess Lib "kernel32.dll" Alias "CreateProcessA" ( _
        ByVal lpApplicationName As String, _
        ByVal lpCommandLine As String, _
        ByRef lpProcessAttributes As SECURITY_ATTRIBUTES, _
        ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, _
        ByVal bInheritHandles As Integer, _
        ByVal dwCreationFlags As Integer, _
        ByRef lpEnvironment As Integer, _
        ByVal lpCurrentDriectory As String, _
        ByRef lpStartupInfo As STARTUPINFO, _
        ByRef lpProcessInformation As PROCESS_INFORMATION) As Integer

    Const NORMAL_PRIORITY_CLASS As Integer = &H20

    Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Integer) As Integer

    Const MAX_PATH As Integer = 260

    Public Structure OVERLAPPED
        Public ternal As Integer
        Public ternalHigh As Integer
        Public offset As Integer
        Public OffsetHigh As Integer
        Public hEvent As Integer
    End Structure

    Declare Function ReadFile Lib "kernel32.dll" ( _
        ByVal hFile As Integer, _
        ByVal lpBuffer As System.Text.StringBuilder, _
        ByVal nNumberOfBytesToRead As Integer, _
        ByRef lpNumberOfBytesRead As Integer, _
        ByRef lpOverlapped As OVERLAPPED) As Boolean

    Shared Function CmdAnswer2Buff(ByRef Command As String) As String
        Dim hReadPipe As IntPtr = Nothing
        Dim hWritePipe As IntPtr = Nothing

        Dim sa As SECURITY_ATTRIBUTES
        sa.nLength = System.Runtime.InteropServices.Marshal.SizeOf(sa)
        sa.lpSecurityDescriptor = Nothing
        sa.bInheritHandle = True

        If CreatePipe(hReadPipe, hWritePipe, sa, 0) = 0 Then
            MsgBox("Вызов функции CreatePipe() не прошёл успешно.", MsgBoxStyle.Critical, "Ошибка.")
            Return Nothing
        End If

        Dim cif As STARTUPINFO = New STARTUPINFO()
        cif.cb = System.Runtime.InteropServices.Marshal.SizeOf(cif)
        cif.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
        cif.wShowWindow = SW_HIDE
        cif.hStdOutput = hWritePipe
        cif.hStdError = hWritePipe
        Dim pi As PROCESS_INFORMATION = New PROCESS_INFORMATION()

        If CreateProcess(Nothing, Command, Nothing, Nothing, True, NORMAL_PRIORITY_CLASS, Nothing, Nothing, cif, pi) = 0 Then
            MsgBox("Путь или команда не верна", MsgBoxStyle.Critical, Command)
            Return Nothing
        End If

        CloseHandle(hWritePipe)
        CloseHandle(pi.hProcess)
        CloseHandle(pi.hThread)

        Dim ret As Boolean = True
        Dim BufferA As System.Text.StringBuilder = New System.Text.StringBuilder(MAX_PATH)

        Dim NumberOfBytesRead As Integer
        Dim Buffer As String = Nothing
        Do
            ret = ReadFile(hReadPipe, BufferA, MAX_PATH - 1, NumberOfBytesRead, Nothing)
            If NumberOfBytesRead > 0 Then Buffer = Buffer & BufferA.ToString
        Loop While ret

        CloseHandle(hReadPipe)
        Return Buffer
    End Function
Использовать так Console.WriteLine(CmdAnswer2Buff("7z /?"))
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:10, 25-08-2010 | #8


Аватара для RUVATA

Старожил


Сообщения: 301
Благодарности: 16

Профиль | Отправить PM | Цитировать



без комментариев...
у меня весь проект едва-ли половина описанного решения...

-------
Одно дело искать сиюминутное решение, другое - искать знания...
вот и думай - что ты ищешь...


Отправлено: 15:39, 25-08-2010 | #9


Аватара для RUVATA

Старожил


Сообщения: 301
Благодарности: 16

Профиль | Отправить PM | Цитировать


А ТЕПЕРЬ описываю ПРАВИЛЬНЫЙ СПОСОБ перенаправления ввода\вывода любого процесса
в стандартные потоки используемые в консоли VS консольного приложения на vb.NET

Код: Выделить весь код
 

        Dim MyProcess As New Process

        '          
        MyProcess.StartInfo.FileName = "7z"
        '           StartInfo.FileName  - если приложение не описанно в sys.переменной PATH,
        '           то указывать полное имя к программе... н\п "C:\Program Files\7-Zip\7z.exe"
        MyProcess.StartInfo.UseShellExecute = False
        '           это праметр определяет оболочку которая необходима для запуска процесса
        '           это приблуда для кроссплатформенности - ЗАБЫЛИ тупо всегда назначаем "False"
        '           тобишь открываем Wind-ой
        MyProcess.StartInfo.RedirectStandardInput = True
        '           перенаправление потока ВВОД, и дискриптора 2 на стандартный поток реального времени
        MyProcess.StartInfo.RedirectStandardOutput = False
        '           перенаправление потока ВЫВОД нам ни в коем случае не нужно... так что назначаем "False"
        '           и не забываем что речь идет о процессе у него все зеркально пользователю... т.е. то что пользователю ВЫВОД
        '           то процессу ВВОД
        MyProcess.Start()
        '           запуск процесса.
        Console.ReadKey()
        '           остановка на получении NextKey в консоли... для того чтоб она не закрылась
Сравним с решением при помощи API;

Admiral,
научи код красиво выкладывать как у тя... все с цветом как надо

-------
Одно дело искать сиюминутное решение, другое - искать знания...
вот и думай - что ты ищешь...


Последний раз редактировалось RUVATA, 25-08-2010 в 16:48.


Отправлено: 16:38, 25-08-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - [решено] запуск приложения с параметром /?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
запуск с параметром? mikola1983 AutoIt 4 17-12-2009 19:49
Прочие - удалённый запуск/завершение приложения danya_rus Программное обеспечение Windows 0 27-05-2009 18:48
Запуск терминального приложения Rulezzz2 Microsoft Windows NT/2000/2003 2 11-03-2009 16:00
Запуск приложения после установки ОС ArGoth Автоматическая установка Windows 2000/XP/2003 1 25-05-2008 19:47
запуск DOS приложения Pupil Microsoft Windows 2000/XP 8 29-12-2003 12:42




 
Переход