|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - [решено] запуск приложения с параметром /? |
|
|
.NET - [решено] запуск приложения с параметром /?
|
Старожил Сообщения: 301 |
Профиль | Отправить PM | Цитировать Всем доброго времени суток
при помощи System.Diagnostics.Process.Start можно запускать\останавливать и управлять процессами... все ОК, но вот как-бы help по параметрам посмотреть... параметр /? предоставляет справку в cmd если они у проги имеются... Visual Studio 2010 //// vb.NET консольное приложение мне на определенном этапе необходимо, чтобы открылась вот эта самая справка... архиватор 7zip прописан в сист.PATH как "7z" н\п видно как поверх консоли VS открывается еще одна в ней отображается справка и закрывается (доля секунды)... как бы задержать вот эту справку? |
|
------- Отправлено: 14:13, 24-08-2010 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать RUVATA если допустимо что б текст справки выводился не поверх консоли VS, а прямо в ней, то можно и не задерживать вывод.
Для осуществления вывода в консоль VS необходимо будет задействовать средства Win32: CreatePipe -> Accessing CreateProcess from C# and VB.NET -> ReadFile |
Отправлено: 12:57, 25-08-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 301
|
Профиль | Отправить 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 ... без проблем |
------- Отправлено: 13:53, 25-08-2010 | #3 |
Ветеран Сообщения: 3320
|
Профиль | Отправить 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 |
Старожил Сообщения: 301
|
Профиль | Отправить PM | Цитировать так... я все поправил код работает... и смысл?
Цитата Admiral:
|
||
------- Отправлено: 14:02, 25-08-2010 | #5 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать RUVATA это не готовый по вопросу пример, а пример лишь использования CreateProcess в VB.NET
Для осуществления поставленной задачи нужно последовательно использовать сразу три Win32:
|
Отправлено: 14:07, 25-08-2010 | #6 |
Старожил Сообщения: 301
|
Профиль | Отправить PM | Цитировать ну... как бы... я все равно не понял о чем этот пример, функция CreateProcess это API-шный аналог NET-овского Process.Start ? Зачем?
мамочка... а вот есть еще такая "фитча" Console.Set(In/Out) занимается перенаправлением ввода\вывода в консоль там никак не замудрить... проблемма то как раз в том, чтобы найти вывод от "7z" Запущенного Process.Start, и перенаправить его в Console... не верится что такая "хрень" требует аш 3 функции API... кстати про Цитата Admiral:
Цитата Admiral:
сам сейчас копаюсь в закаулках vb.NET все что касает перенаправления ввода\вывода... есть способы клонировать поток, направить поток, но уже от запущенного процесса... а в моем случае его надо перенаправить перед его запуском - вот тут тупняк |
||
------- Отправлено: 14:57, 25-08-2010 | #7 |
Ветеран Сообщения: 3320
|
Профиль | Отправить 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 |
Отправлено: 15:10, 25-08-2010 | #8 |
Старожил Сообщения: 301
|
Профиль | Отправить PM | Цитировать без комментариев... у меня весь проект едва-ли половина описанного решения... |
------- Отправлено: 15:39, 25-08-2010 | #9 |
Старожил Сообщения: 301
|
Профиль | Отправить 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 в консоли... для того чтоб она не закрылась Admiral, научи код красиво выкладывать как у тя... все с цветом как надо |
------- Последний раз редактировалось RUVATA, 25-08-2010 в 16:48. Отправлено: 16:38, 25-08-2010 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
запуск с параметром? | 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 |
|