Войти

Показать полную графическую версию : [решено] Скрытый запуск внешнего консольного приложения


RUVATA
16-01-2011, 13:51
Всем доброго времени суток... (язык vb.NET)
Столкнулся с тривиальной казалось бы проблемой, но те методы которые вроде бы должны выполнять эту функцию не дают ни какого эффекта...
Суть: моей программой используется внешняя программа (утилита Handle.exe от Windows SysInternals), я передаю ей некие аргументы, а с ее StandartOutput читаю к себе в переменную.
"Умный справко" говорит: Для запуска процесса, не отображая ее на экране, предварительно укажите
ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden
ну так... вот и ни хрена ничего не скрывается

Public Function UseHandle(ByVal Arg As String)
Dim my_handle As New Process
Dim myProcessStartInfo As New ProcessStartInfo(System.Windows.Forms.Application.StartupPath & "\Handle.exe")
myProcessStartInfo.UseShellExecute = False
myProcessStartInfo.RedirectStandardOutput = True
myProcessStartInfo.Arguments = Arg
myProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden
my_handle.StartInfo = myProcessStartInfo
my_handle.Start()
my_handle.WaitForExit()
Return (my_handle.StandardOutput.ReadToEnd)
my_handle.Close()
End Function

Все равно это чертово cmd-шное окно мелькает
Как быть? Shell не пробовал, да и не катит... мне надо процесс как объект юзать.

lxa85
16-01-2011, 14:29
RUVATA, может имеет смысл сначала сделать окно невидимым, а уже потом запускать?

Admiral
16-01-2011, 17:36
RUVATA если не получается .NET вариант то тогда стоит API вариант запуск приложения с параметром /? (http://forum.oszone.net/post-1481419.html#post1481419)
По текущему коду есть замечания.
Не указан тип функции UseHandle. Последняя строчка никогда не выполнится, так как в предпоследней указан Return.

RUVATA
17-01-2011, 08:43
Последняя строчка никогда не выполнится, так как в предпоследней указан Return. »
верно, ошибка не заметна, так как объект процесса созданный в функции закрывается вместе с ней, кстати почему так?

PS: проблема решена... использованием свойства ProcessStartInfo.CreateNoWindow = True
которое требует определенного значения другого свойства ProcessStartInfo.UseShellExecute = False (обязательно)
соответственно свойство
ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden (действует только для программ с Windows.Forms интерфейсом)

вот полностью рабочий пример функции вызывающей handle из директории с программой...
handle отрабатывает скрыто.
передаваемый аргумент - строка (целевая директория)
возвращаемое значение - строка (вывод handle.exe)


Public Function UseHandle(ByVal Arg As String)
Dim my_handle As New Process
Dim myProcessStartInfo As New ProcessStartInfo(System.Windows.Forms.Application.StartupPath & "\Handle.exe")
Dim HandleText As String
myProcessStartInfo.UseShellExecute = False
myProcessStartInfo.RedirectStandardOutput = True
myProcessStartInfo.Arguments = Arg
myProcessStartInfo.CreateNoWindow = True
my_handle.StartInfo = myProcessStartInfo
my_handle.Start()
my_handle.WaitForExit()
HandleText = my_handle.StandardOutput.ReadToEnd
my_handle.Close()
Return (HandleText)
End Function




© OSzone.net 2001-2012