Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256

Управление сторонним приложением

10.06.2015, 21:17. Показов 4973. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
1) есть готовая чужая программа для обрезки видео. С программой работаем через командную строку windows;
2) есть моя программа.

Нужно:
1) отправить н-ное количество cmd команд чужой программе;
2) дождаться ответа
3) получить этот ответ в текстовом формате
4) найти среди этого текста нужное число (длинну видео)
5) далее я попробую уже сам разобраться, если что не получится, буду писать сюда.

6) обработать как-то ошибки (может через if) тоже попробую сам, но в основном нужна ваша помощь.

Знаю вроде что отправлять терминальные команды можно через Shell но это если одну, а если несколько последовательных? И как и когда закрывается терминальная сессия? Закрывается ли она вообще?
Короче вот как-то так..

Спасибо за бесценную помощь!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.06.2015, 21:17
Ответы с готовыми решениями:

Открыть видеофайл сторонним приложением
Доброе время суток. Подскажите пожалуйста: Как открыть видео файл при нажатии на кнопку Т.е. есть заранее определенный файл...

Получить данные из буфера обмена, записанные сторонним приложением
Такая вот ситуация в чужом приложении, в CorelDRAW (вект. редактор), я нажимаю кнопку копировать. И теперь хочу чтобы моя программка...

Программное управление внешним приложением
Здравствуйте! Стоит задача программно управлять внешним приложением стороннего производителя. Напрямую идентифицировать нужные...

15
Эксперт .NET
 Аватар для Rius
13118 / 7679 / 1674
Регистрация: 25.05.2015
Сообщений: 23,423
Записей в блоге: 14
10.06.2015, 21:29
Не Shell, нужно запустить процесс и перехватить sdtin/stdout/stderr.
Собственно, куча примеров ищется по .Net redirect stdout
1
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
13.06.2015, 21:08  [ТС]
Спасибо, буду гуглить!
Как нагуглю, отпишусь.
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
16.06.2015, 20:50  [ТС]
Нагуглил, но ничего понять не могу вообще!
Пожалуйста, кому не лень, объясните нубу что к чему, а то не вкумекаю никак...
0
Эксперт .NET
 Аватар для Rius
13118 / 7679 / 1674
Регистрация: 25.05.2015
Сообщений: 23,423
Записей в блоге: 14
16.06.2015, 21:50
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
            Process p = new Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.FileName = "route";
            p.StartInfo.Arguments = "print";
            p.Start();
            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
Добавлено через 1 минуту
https://msdn.microsoft.com/ru-... 10%29.aspx
https://msdn.microsoft.com/ru-... 10%29.aspx
https://msdn.microsoft.com/ru-... 10%29.aspx
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
16.06.2015, 23:01  [ТС]
Ваш кусок кода вставляется с ошибками, не могу понять почему так?
0
Эксперт .NET
 Аватар для Rius
13118 / 7679 / 1674
Регистрация: 25.05.2015
Сообщений: 23,423
Записей в блоге: 14
16.06.2015, 23:05
Код C# как бы намекает, что это C#. Net.
Переведите на VB. Net.
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
16.06.2015, 23:22  [ТС]
Ага, только что дошло, что то Вы не ошиблись)
Уже переделываю. В принципе Ваш код мне более понятен чем те примеры на сайтах...

Добавлено через 14 минут
Пока не тестировал, но получилось примерно такое:

VB.NET
1
2
3
4
5
6
7
8
9
10
Dim ffprobe_process As New Process()
            ffprobe_process.StartInfo.UseShellExecute = False
            ffprobe_process.StartInfo.RedirectStandardInput = True
            ffprobe_process.StartInfo.RedirectStandardOutput = True
            ffprobe_process.StartInfo.RedirectStandardError = True
            ffprobe_process.StartInfo.FileName = Path
            ffprobe_process.StartInfo.Arguments = "<МОЯ_КОМАНДА ДЛЯ ПРИЛОЖЕНИЯ>"
            ffprobe_process.Start()
            Me.RichTextBox1.Text = ffprobe_process.StandardOutput.ReadToEnd
            ffprobe_process.WaitForExit()
Огромное спасибо!
0
Эксперт .NET
 Аватар для Rius
13118 / 7679 / 1674
Регистрация: 25.05.2015
Сообщений: 23,423
Записей в блоге: 14
16.06.2015, 23:28
Этого не достаточно. Изучайте справку по ссылкам выше.
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
17.06.2015, 00:39  [ТС]
Ну насколько я понял, Arguments это не команда, а всего лишь параметры запуска приложения (если нужно запустить его с параметром)...
Нужна именно консольная сессия. Пока для меня это туман...

ну вот оглашаю переменную (но это не похоже на переменную):
VB.NET
1
Dim myStreamWriter As StreamWriter = myProcess.StandardInput
А это я типа пишу уже консольную команду правильно? :
VB.NET
1
Console.WriteLine("Enter a line of text (or press the Enter key to stop):")
Дальше мне вообще ничего не понятно

Добавлено через 59 минут
Не.. Хоть убейте не пойму примера... Ну стартует процесс и что дальше у них происходит? Может у них приложение открывается и ждет ввода данных? У меня же со сторонней программой можно работать только непосредственно из терминала винды, введя при этом например "ffprobe "C:/Video.mp4"". Программа выводит полную информацию о видеофайле... Но запускать программу, а после вводить в нее что-то бесполезно, она закрывается сразу же...

В Вашем примере кода все вроде сходится, типа команду я задаю в качестве параметра запуска и сразу же ловлю ответ, потом прога закрывается...
Но оно не работает... Проверял уже... Вы говорите что чего-то не хватает.. Я понять не могу, чего именно? Господь Бог свидетель что все это время пялился в пример как баран на новые ворота... Вспомнилось только старый язык Turbo Pascal со своими ReadLn и WriteLn... Но это ж только чтобы что-то вывести в консоль или считать с консоли (когда юзер вводит).. Но это же не дает команду приложению.
Короче поясняйте, я уже больше не могу, мозги пухнут...
0
Эксперт .NET
 Аватар для Rius
13118 / 7679 / 1674
Регистрация: 25.05.2015
Сообщений: 23,423
Записей в блоге: 14
17.06.2015, 06:26
Запускаете процесс, с аргументами или без - смотрите сами.
Процесс висит и ждёт ввода команды/данных/текста с клавиатуры.
Если включен редирект stdout, приглашение к вводу можно считать через поток StandardOutput.
Если включен редирект stdin, данные можно ввести из своей программы через поток StandardInput.
И смотреть на результат выполнения снова через StandardOutput.
1
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
23.06.2015, 02:28  [ТС]
Спасибо за разъяснения!)
Получилось)

Только:
1) Ответ почему-то приходит не в Output, а в Error;
2) Исходя из этого, убираю строку "... .StartInfo.RedirectStandardOutput = True" из общего списка (за ненадобностью) и в последствии аутпат не обрабатываю никак. В результате получаю в добавок к чистому ответу еще штук 7 ошибок.. Поэтому оставил ту строку и получаю чистый ответ, хоть и в потоке ошибок (но это все не главное);
3) Главное то, что эта вся ересь в упор не фурычит с русскими символами! Я ведь в консоль скармливаю команду, включающую путь к видеофайлу, а этот путь (в прочем как и само имя файла) может быть с кириллицей! Я понимаю что дело в кодировке! Командная строка вообще (насколько я понимаю) адекватно работает только с кодировкой OEM 866! Но как мне ее получить?

Вот этот весь огород:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim GetFileInfo As New Process()
                GetFileInfo.StartInfo.FileName = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Console.cmd"
                GetFileInfo.StartInfo.UseShellExecute = False
                GetFileInfo.StartInfo.RedirectStandardInput = True
                GetFileInfo.StartInfo.RedirectStandardOutput = True
                GetFileInfo.StartInfo.RedirectStandardError = True
                GetFileInfo.Start()
 
                Dim myStreamWriter As IO.StreamWriter = GetFileInfo.StandardInput
                Command = "ffprobe -i """ & Path4Playlist(CurrentFile) & """"
                myStreamWriter.WriteLine(Command)
                myStreamWriter.Close()
                GetFileInfo.WaitForExit()
 
                Me.RichTextBox1.Text = GetFileInfo.StandardOutput.ReadToEnd()
                GetFileInfo.StandardOutput.Close()
                GetFileInfo.WaitForExit()
 
                Me.RichTextBox2.Text = GetFileInfo.StandardError.ReadToEnd()
                GetFileInfo.StandardError.Close()
                GetFileInfo.WaitForExit()
 
                GetFileInfo.Close()
0
Эксперт .NET
 Аватар для Rius
13118 / 7679 / 1674
Регистрация: 25.05.2015
Сообщений: 23,423
Записей в блоге: 14
23.06.2015, 12:53
М.б.
C#
1
process.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(850);
или 866 там...
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
24.06.2015, 02:04  [ТС]
Мимо.. Кракозябры другие, но от этого не легче)

Добавлено через 1 час 31 минуту
Кажись я понял в чем проблема. Да и сам код коряво был написан в плане кодировок. Часть кода уже исправил и эта часть теперь работает правильно. Саму то команду я подаю в левой кодировке, а надо подавать ее в 866. Если я нащупаю как это сделать, то будет пахать и никуда не денется.

Дело в том, что стартуя процесс ffprobe.exe, он сразу же закрывается, а не ждет от меня команд. Команд ждет cmd.exe, то есть реальный терминал винды, но так как мне в падлу его искать (да и мало ли что не так), то я сам решил сгенерировать программно *.cmd файл и поместить его в некую папку. В сам этот файл я уже поместил команду cd <путь к папке с файлом ffprobe.exe> и далее передал управление юзеру. Таким образом я получил готовое приложение, которое не закрывается сразу же после открытия, а именно висит и ждет от юзера команд, управление которыми я в последствии перехвачиваю. Так вот этот файл я сохранял ранее без указания кодировки!! То есть уже в результате двойного клика по этому файлу я видел в консоли кракозябры! Непорядок! Добавил в параметры сохранения 866 кодировку:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
'Формируем командный сценарий Windows:
            Lines(0) = "@echo off"
            Lines(1) = "color 0A"
            Lines(2) = ":start"
            Lines(3) = "cls"
            Lines(4) = "echo."
            Lines(5) = "echo Привет, %USERNAME%! Пожалуйста введите команду ниже:"
            Lines(6) = "echo."
            Lines(7) = "cd """ & Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & """"
            Lines(8) = "CMD /F:ON /Q /K"
 
            LinesAll = Join(Lines, vbNewLine)
            IO.File.WriteAllText(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Console.cmd", LinesAll, System.Text.Encoding.GetEncoding(866))
Затем я запускаю процесс Console.cmd и перехвачиваю управление.
Аутпат читаю уже тоже в кодировке 866 и все чётенько) Русские буквы как полагается)))
А вот с ответом от самой программы ffprobe.exe, который приходит в ошибку возникают проблемы. Но проблема в том, как и писал уже выше, что сам путь к видеофайлу приходит в хрен знает какой кодировке, а не 866! Сама программа не понимает пути с русскими символами и в ответе пишет "No such file or directory", естественно дальше уже ни о каком поиске инфы с длинной видео не может идти и речи.
Вот кстати код выполнения процесса:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Dim GetFileInfo As New Process()
                GetFileInfo.StartInfo.FileName = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Console.cmd"
                GetFileInfo.StartInfo.UseShellExecute = False
                GetFileInfo.StartInfo.RedirectStandardInput = True
                GetFileInfo.StartInfo.RedirectStandardOutput = True
                GetFileInfo.StartInfo.RedirectStandardError = True
                GetFileInfo.StartInfo.StandardOutputEncoding = System.Text.Encoding.GetEncoding(866)
                GetFileInfo.StartInfo.StandardErrorEncoding = System.Text.Encoding.GetEncoding(866)
                GetFileInfo.Start()
 
                Dim myStreamWriter As IO.StreamWriter = GetFileInfo.StandardInput
                Command = "ffprobe -i """ & Path4Playlist(CurrentFile) & """"
                myStreamWriter.WriteLine(Command)
                myStreamWriter.Close()
                GetFileInfo.WaitForExit()
 
                Me.RichTextBox1.Text = GetFileInfo.StandardOutput.ReadToEnd()
                GetFileInfo.StandardOutput.Close()
                GetFileInfo.WaitForExit()
 
                Me.RichTextBox2.Text = GetFileInfo.StandardError.ReadToEnd()
                GetFileInfo.StandardError.Close()
                GetFileInfo.WaitForExit()
 
                GetFileInfo.Close()
Здесь хорошо видно что переменная Command подается без указания кодировки, а нужна 866. Отсюда и руки-ноги у проблемы растут.
0
Эксперт .NET
 Аватар для Rius
13118 / 7679 / 1674
Регистрация: 25.05.2015
Сообщений: 23,423
Записей в блоге: 14
24.06.2015, 08:13
Попробуйте указывать кодировку в новом потоке
C#
1
2
3
StreamWriter utf8Writer = new StreamWriter(proc.StandardInput.BaseStream, Encoding.UTF8);
utf8Writer.Write(...);
utf8Writer.Close();
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
25.06.2015, 02:39  [ТС]
Помогло!)
Только чуток не так. Надо было написать:

VB.NET
1
Dim myStreamWriter As New IO.StreamWriter(GetFileInfo.StandardInput.BaseStream, System.Text.Encoding.GetEncoding(866))
вместо:

VB.NET
1
Dim myStreamWriter As IO.StreamWriter = GetFileInfo.StandardInput
Спасибо!) Вы вроде как и не пишете конкретно то, что помогает, но в то же время подталкиваете меня в нужном направлении)
Огромное спасибо за помощь! Работает! Уже показывает длину видеофайла с русским именем)

Добавлено через 1 час 32 минуты
Кстати программа ffprobe возвращает ответ в кодировке UTF8 почему-то... Поэтому вместо:

VB.NET
1
GetFileInfo.StartInfo.StandardErrorEncoding = System.Text.Encoding.GetEncoding(866)
нужно:

VB.NET
1
GetFileInfo.StartInfo.StandardErrorEncoding = System.Text.Encoding.UTF8
Вот так уже наверняка правильно, хотя для моих нужд это не принципиально (ведь английские символы в ответе все равно отображаются правильно хоть так, хоть иначе), но все же так правильнее если речь идет о русских символах в ответе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2015, 02:39
Помогаю со студенческими работами здесь

Нужна консультация, управление сторонним приложением
Здравствуйте, нужна консультация разработчиков приложений на Android. Возможно ли разработать приложение, которое могло бы управлять...

Взаимодействие со сторонним приложением
Здравствуйте, есть сторонняя программа, мне нужно выводить с нее информацию и передавать моей программе после каких то логических действий...

Работа со сторонним приложением
Здравствуйте! Прошу вашей помоши потому что сам не так силён в Delphi. Опишу саму проблему и думаю вы сами поймёте. 1. Есть программа WP...

Открытие файла сторонним приложением
Мне нужно, чтобы по нажатию кнопки в моем приложении выполнялась функция по запуску файла(например видео-файла) уже сторонним...

Работа со сторонним приложением и веб браузером
Доброго времени суток. Вопрос в следующем: Есть файл в формате ехе, при его открытии запускается браузер стоящий по умолчанию на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru