Толик Панков
hex_laden
............ .................. ................
Page Summary

December 2025
  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 26 27
28 29 30 31

Back Viewing 0 - 20  
Типа великий пост.

ДЛЯ:
0. Связи
1. Личных сообщений
2. Флуда
3. Срачей
4. ....
666. PROFIT
История, описание, FAQ этого блога.
Блогополезности
Список личных фриков и забаненных
Написать письмо:hexxladen[inu]inbox.lv
Другая контактная информация есть в профиле
Поиск по блогу:


Другие ресурсы:

Дружественные проекты:
Сайт сообщества свободомыслящих Том Хаоса by Paperdaemon Жизнедеятельность депутата Семенова Сергея Сергеевича Федеральный список экстремистских материалов Семенов Сергей Сергеевич. Секреты депутата. Открыто для доступа из РФ

Current Mood: дверь запили
Current Music: панк-рок
Запись из BAT/CMD-файла в STDERR.

Небольшой пост из серии спрашивали - отвечаем.

Примечание: это работает только в версиях Windows, где командный процессор умеет в расширенную обработку команд, т.е., начиная с Windows 2000.

Расширенная обработка команд по умолчанию включена в Windows Server 2003/Windows XP, но может быть отключена через Реестр, так что для совместимости лучше ее включить явно:

SetLocal EnableExtensions

Команда echo по умолчанию выводит на STDOUT, т.е., например, команда:

echo I write to STDOUT

Выведет текст I write to STDOUT на STDOUT, да на мне капитанская фуражка :)

Для вывода текста на STDERR необходимо использовать переопределение вывода, синтаксис которого похож на аналогичный синтаксис в Linux, т.е. в современных Windows тоже есть три канала ввода/вывода, с номерами, аналогичными Linux, т.е.:

1 - STDOUT
2 - STDERR
3 - STDIN

Стандартные потоки

Переопределяется вывод на STDERR конструкцией 1>&2, т.е. команда

echo I write to STDERR 1>&2

Выведет текст I write to STDERR на STDERR.

BAT-файл writeto.bat целиком:

@echo off
SetLocal EnableExtensions
rem This BAT file write in stdout and stderr

echo I write to STDOUT
echo I write to STDERR 1>&2


Проверка


Для проверки работы BAT-файла можно создать тестовый BAT-файл, который будет вызывать файл writeto.bat и перенаправлять потоки вывода STDOUT и STDERR в текстовые файлы.
Содержимое файла writeto_test.bat:

@echo off
SetLocal EnableExtensions
rem This BAT file test for writeto.bat

call writeto.bat 1>_stdout.txt 2>_stderr.txt


Данный файл надо создать в каталоге с writeto.bat.

После запуска файла writeto_test.bat в текущем каталоге появятся файлы _stdout.txt и _stderr.txt со следующим содержимым:

_stdout.txt:
	I write to STDOUT

_stderr.txt:
	I write to STDERR


ФАНФАРЫ!

Пример на GitHub

Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2021/10/14/zapis-iz-bat-cmd-fajla-v-stderr/

Tags: ,
HUILO.EXE: Не дай Украине остаться без газа!

Пересобрал в экзешник прикольную старую флешевскую игрушку, как раз на злобу дня.

Правила простые - кидайтесь яйцами в Хуйло, и не забывайте закрывать вентили, которые Хуйло успело открутить (кликом по ним).



Скачать с Mega.NZ (RAR: SWF+EXE)

Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2021/10/14/huilo-exe-ne-daj-ukraine-ostatsya-bez-gaza/

Никуда не деться от любви

Вон, зайчиха в котявку влюбилась, а ви таки паритесь...



Смотреть полную версию клипа

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/28/nikuda-ne-detsya-ot-lyubvi/

OT VINTA - Не мала баба клопоту...

Спрашивали - отвечаем. Да, я знаю эту песню и люблю ее, как очень многое из украинского рока (в данном случае - рокабилли).

Есть ютубная версия:



Прямая ссылка: https://youtu.be/u7DhIEm6BDI

Но для моих дорогих подпизчиков мне удалось сохранить самую первую версию клипа во Flash, которая откроет все его грани в УльтраHD-качестве, и да, вряд ли, за давностью лет, она сохранилась у самих Ot Vinta.

Скачать SWF+EXE с Mega.NZ

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/28/ot-vinta-ne-mala-baba-klopotu/

БрокаЦентр - ДЕрьМО [Full album, 2003]



Прямая ссылка https://youtu.be/3ch8qdiOXB0:

Tracklist:

00:00 - Хой!
03:40 - Сыпь, гармоника (стихи С. Есенина)
06:00 - Рожь
08:29 - Ботинки и пиво
10:24 - Мой друг
12:08 - Ода конопле
13:33 - Пьяница (стихи С. Есенина)
16:41 - Бои без правил (skinhead music)
20:41 - Настёна

На Realrock/Realmusic

Альбом на MEGA.NZ (RAR and MP3)

ЗЫ. Красно-черную в хорошем качестве не нашел, но может чего другое М.В. зайдет, ИМХО, так "Хой!" годная. Или "Бои без правил". Ну "Ода конопле" должна Глебу зайти.

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/28/brokatsentr-dermo-full-album-2003/

Инопланетная пятница!

Менеджер, бухгалтерша и сисадмин, инопланетные на астероиде отмечают пятницу ^_^, хотя мне в общем смысле Ф.И.О. Летова, т.к. у меня каждый день пятница.



Скачать с Mega.NZ

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/27/inoplanetnaya-pyatnitsa/

C#, как записать в STDERR сообщение об ошибке из консольного приложения.

Пост из серии спрашивали - отвечаем.

Итак, как в C# записать в STDERR. STDERR - это стандартный поток вывода для сообщений об ошибках, туда правильно организованные консольные приложения отправляют, собственно, сообщения об ошибках. Отправить в STDERR сообщение можно с помощью объекта Console.Error:

Console.Error.WriteLine("Write to STDERR.");

Код тестового приложения


static void Main(string[] args)
{
    Console.WriteLine("Write to STDOUT.");
    Console.Error.WriteLine("Write to STDERR.");
}


Проверка


Для проверки можно создать BAT-файл, вызывающий тестовое приложение и переопределяющий (копия) вывод со стандартных потоков в файлы stderr_.txt и stdout_.txt. stderr и stdout являются зарезервированными системными именами, потому к именам файлов надо что-то добавить, знак _ в данном случае:

Экран при выполнении тестового приложения:

Z:\...\write2stderr\write2stderr\bin\Debug>write2stderr.exe
Write to STDOUT.
Write to STDERR.

При выполнении BAT-файла экран останется пустым, но в директории с файлом появятся два файла stderr_.txt и stdout_.txt со следующим содержимым.

stderr_.txt:
	Write to STDERR.

stdout_.txt:
	Write to STDOUT.


Пример на GitHub


Исходник
Тестовый BAT-файл
BAT-файл и скомпилированный EXE

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/26/c-kak-zapisat-v-stderr-soobshhenie-ob-oshibke-iz-konsolnogo-prilozheniya/

Tags: ,
Мухоморовые недотрипы или (псевдо)научный эксперимент на себе.

Диклеймер


В этом тексте описываются опасные эксперименты. Пожалуйста, не повторяйте их дома. Автор и редакция отказываются от любой ответственности, если вы повторите опыты на себе.

Красный мухомор не содержит наркотических или иных запрещенных веществ, внесенных в списки таковых в Российской Федерации, США, Украине, Великобритании, Австралии или Европейском Союзе. Данный текст является любительским научным исследованием и не пропагандирует употребление запрещенных веществ. Красный мухомор относится к ядовитым, условно ядовитым или несъедобным грибам, в зависимости от классификации в различных научных исследованиях. Мы не рекомендуем его употребление. При самостоятельном сборе, при отсутствии твердых знаний в определении видов грибов, можно перепутать мухомор красный с другими схожими видами (мухомор вонючий, мухомор поганковидный, и даже с бледной поганкой), что несет прямую угрозу жизни и здоровью. Если Вы не обладаете соответствующими знаниями, не пытайтесь самостоятельно собирать грибы.

Преамбула


Давно хотел написать про сабж, а сегодня вот [info]glebo с началом сезона поздравляет. Я уже пару лет назад насмотрелся и наслушался Вишневского, и все хотел проверить на себе, як воно.

Естественно, перед всеми экспериментами 5 дней не употреблялось других психоактивных веществ, в т.ч. и алкоголя. Исключение - никотин.

Недотрип первый


В прошлом 2020 году, где-то в начале сентября, я таки собрался за мухоморами, собрал. Доза - две средних взрослых (раскрывшихся) шляпки, и две молодых (нераскрывшихся). Фото в прошлый раз, к сожалению, не делал.
Употребление: необработанными с солью.
Эффект: где-то минут через 40 появился звон в ушах, немного затормозилось восприятие окружающего, были очень слабые визуалы, буквально на периферии зрения, вроде как капли воды на объективе фотоаппарата, когда в визор смотришь, впрочем, они быстро пропадали. Постепенно к горлу подкатывал ком, потом я попросил ассистента принести мне таз, сам принял лежачее положение, т.к. просто "поплохело" по общему состоянию.

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

Потом меня стошнило в таз, довольно мощно. Поскольку употреблял почти на голодный желудок, то вырвало довольно беспроблемно и не очень противно. Выпил сладкого морса, опять стошнило сладеньким, второй раз блевать было даже как-то по кайфу.

После рвоты расслабило, неприятные ощущения ушли, стало как-то кайфово, не сильно, скорее как "дички", т.е. очень лайтовой травы покурил. Включил плейлист с Ragga-Jungle миксами и просто валялся на диване, наслаждаясь музыкой и расслабоном.

Опыт второй


Буквально по горячим следам. Почему-то получился более негативным, хотя я последовал совету опытного "грибника" [info]glebo, который он давал анонимусу, также столкнувшемуся с проблемой тошноты: слегка обжарить мухоморы на сливочном масле.

Вот сырье:


Из пожаренного съел примерно три четверти, потом как-то резко не полезло, хотя, ярко выраженного кома в горле тоже не возникло, на вкус приемлемо, хотя и необычно. Но кулинар из меня говно в любом случае, так что ничего страшного. Опять все пошло во тому же сценарию, что и в предыдущем случае - какие-то легкие визуалы, когда смотрел на бетонную стену в дальнем помещении офиса, она как бы "дышала", но очень незначительно, и звон в ушах.

Потом меня отвлекли от самосозерцания - приперся какой-то коммивояжер, но я был поглощен экспериментом, потому, с одной стороны, ему повезло, я ему открыл. А с другой стороны, он меня, наверное, за наркомана ебаного принял, т.к. я просто тупо отвечал "нет" на любые его вопросы, даже по поводу, бывал ли я в "Тетрисе" (это крупный торговый центр в ПТЗ). Комми ушел несолоно хлебавши, и ему, внезапно, в этом повезло, т.к. только он ушел, мне потребовалось очень срочно блевануть, аж так срочно и неожиданно, что еле добежал до сортира. Если бы он не ушел, то был бы заблеван он, его товары, и вообще нахуй все вокруг.

После того, как протошнило, легкости, как в прошлом эксперименте, не наступило, наоборот, стало как-то тяжко и погано. Дошел до диванчика, прилег. На ютубе автоматом включился какой-то исторический выпуск с Тамарой Эдельман, от ее голоса немного полегчало, и я провалился в какой-то недосон, в котором опять же были какие-то не совсем логичные фразы и незнакомые термины, запомнил только то, что все крутилось вокруг Короля в Желтом (лавкрафтовского Хастура, как я после пробуждения понял), еще в этом какие-то то ли эльджели то ли что-то похожее по звучанию, участвовали и вроде как менты, в общем, как я потом понял, мозг что-то себе сам около-лавкрафтовское конструировал из прочитанного и окружающей действительности.

Когда недосон прошел, оставалось какое-то тяжелое состояние, примерно как около-гриппозное. Прошло вот совсем недавно, и то не полностью.

Выводы


Выводы не окончательные, скорее, очень промежуточные. Похоже, мухомор, очень индивидуальный гриб. Например, на [info]glebo и еще одного блоггера с LJR он влияет как легкий галлюциноген/энтеоген, как и на моего друга РыББу из реала. Мне не подходит в "шаманском" или "рекреационном" смысле, возможно, подойдет в более "медицинском". Заготавливаю сырье для проверки некоторых рецептов от Вишневского, и использования в микродозинге от западных исследователей.

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/25/muhomorovye-nedotripy-ili-psevdo-nauchnyj-eksperiment-na-sebe/

Апокалипсис в Петрозаводске

Приехал, а тут писец дождино!



Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/21/apokalipsis-v-petrozavodske/

CMD/BAT, содержит ли переменная число.

Преамбула


В BAT-файлах нет типа переменных, тип разрешается в каждом конкретном случае. Впрочем, это так в большинстве командных языков, в линуксовом bash тоже нельзя явно задать тип переменной.

При этом, процессор cmd не считает числом:

- Числа в системах счисления отличных от десятичной.
- Числа с плавающей точкой (действительные, дробные).
- Если есть лидирующие нули, например 00150 не распознается как число. Хотя с этим мы поборемся.

Числами считаются только целые числа в диапазоне -2147483648..2147483647.

Так как же проверить, число в переменной BAT/CMD-файла или нет? Будем разбираться.

Оставим числа в системах счисления, отличных от десятичной, а также дробные числа. Нормальных механизмов работы в BAT/CMD с ними нет, так что и не будем усложнять.

Решение


1. Включаем расширенный режим (копия) обработки команд. В Windows, начиная с XP SP2 он включен по умолчанию, но лучше явно прописывать для совместимости:

SetLocal EnableExtensions

2. Проверка на пустую переменную. Процессор BAT/CMD считает неинициализированную или пустую переменную пустой, и не задает ей значение 0, если она используется в качестве численной переменной. Так что изначально надо проверять, не пуста ли переменная.
В тестовом примере значение передается в параметре командной строки, его и проверим, а потом запишем значение во внутреннюю переменную скрипта:

rem test if no or void parameter (variable)
if "%~1" == "" (
	echo No arguments. Use  "%~n0%~x0  <test pattern>"
	exit /b 1
)

set INP=%~1


%~n0%~x0 - при расширенной обработке команд %~n достает из переменной, в данном случае переменной %0 имя файла, %~x расширение с точкой. %0 - переменная, содержащая путь к BAT/CMD-файлу

3. Боремся с лидирующими нолями. Данная команда их удалит:

for /f "tokens=* delims=0" %%a in ("%INP%") do set INP=%%a

4. Эта команда сохранит, например 000100, превратив его в 100, но удалит 0 или 000..., так что если переменная после операции оказалась пустой, значит она содержала 0, надо его восстановить, дабы далее избежать ошибок:

if "%INP%" == "" (
set INP=0
)


5. Число или строка. Теперь можно определить, число или строка в переменной, произведя над ней арифметическое действие не изменяющее значение, например, умножение на 1. Сделать это можно с помощью команды set /a. Остается сравнить полученный результат с оригиналом. Если результат операции не равен оригиналу, то в переменной не число, а строка, т.к. результат арифметической операции над строкой всегда будет равен 0:

rem number or not number
set /a "TINP=INP*1"
if NOT %TINP% == %INP% (
	echo Not number!
	exit /b 2
)


6. Положительное или отрицательное число. Далее остается только сравнить числа с 0 с помощью оператора IF и операций сравнения:

Операнд сравненияОписание
EQUРавно
NEQНе равно
LSSМеньше
LEQМеньше или равно
GTRБольше
GEQБольше или равно


rem number type
if %INP% GEQ 0 (
	echo Positive integer
	exit /b 0
)
if %INP% LSS 0 (
	echo Negative integer
	exit /b 0
)


Скрипт целиком


На GitHub

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/17/cmd-bat-soderzhit-li-peremennaya-chislo/

Слегка ебанутая ода традиционному японскому соусу



Скачать с Mega.nz (SWF+EXE)

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/17/slegka-ebanutaya-oda-traditsionnomu-yaponskomu-sousu/

Браузеры для Pentium II и Pentium III (под Windows XP)



В комментарии принесли проблему. Оказывается, более-менее современные браузеры, даже поддерживающие Windows XP не могут запускаться на Pentium II/III и аналогах, т.к. не могут работать без инструкций SSE2. Впрочем, там же в комментариях и решение нашлось:

Версия для Pentium II и Windows XP


Palemoon Firefox 26.5.0 IA-32 Portable

Версия для Pentium III/AthlonXP


Palemoon Firefox 26.5.0 SSE Portable

В общем, пусть тут лежит. Мало ли пригодится.

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/15/brauzery-dlya-pentium-ii-i-pentium-iii-pod-windows-xp/

PAIN vs Справедливая Россия



Голосовать здесь: https://likeness.ru/blog/topic/224384/pain_vs_spravedlivaya_rossiya.php

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/12/pain-vs-spravedlivaya-rossiya/

Pinball Space Cadet, легендарный Пинболл из Windows XP.

Как установить в Windows 7-10.

Преамбула


Пинболл в старых версиях винды действительно был прикольной залипалкой, но в Windows 7 он пропал, причем по довольно смешной причине. Игрушку для M$ писали какие-то сторонние инди-разработчики, и в их исходниках хренженеры M$ не смогли разобраться, во всяком случае, так гласит сетевая легенда. Но позалипать хочется, а нету.

Ну хуй с ним, посоны, я создал, точнее, выдрал из Windows XP.

Работает как в Windows 7 x86 и x64,так и в Windows 10



Скачать инсталлятор с Mega.NZ
Исходный код инсталлятора на NSIS

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/12/pinball-space-cadet-legendarnyj-pinboll-iz-windows-xp/

C#, ввод только цифр (чисел) в текстовое поле (TextBox).

Или окончательное решение цифирьного вопроса.

Преамбула


Ранее мы показывали простые способы, как обеспечить, чтобы в TextBox можно было ввести только цифры, т.е. целое число (копия), а потом расширили пример до ввода в TextBox отрицательных (копия) и дробных чисел (копия)

К сожалению, во всех этих примерах есть фатальный недостаток, текст в них все-таки вставить можно, если воспользоваться стандартным контекстным меню или комбинацией клавиш CTRL+V. На уровне простого взаимодействия с формой и контролами это перехватить невозможно, придется несколько извернуться, т.к. для перехвата события "вставить", придется перехватить сообщение Windows WM_PASTE, которое отправляется окну, или элементу управления окна при выполнении операции вставки. Для Windows, тащемта, однохуйственно, кому отправлять сообщение, форме (окну) или, например, текстовому полю. Т.к. для Windows, и текстовое поле на самом деле окно, просто дочернее, т.е. размещенное в другом окне (форме, в нашем случае). Но это я залез глубоко в бок. Нам нужно добраться до сообщений. А это можно сделать только изнутри самого контрола, но не из событий стандартных контролов, так что будем писать свой!

Постановка задачи: необходимо создать свой контрол на основе текстового поля, который позволяет вводить только числа определенного типа - целые, целые отрицательные, отрицательные и положительные/отрицательные с дробной частью.

Начало


Подключим необходимые пространства имен:

using System.Windows.Forms;
using System.ComponentModel;
using System.Globalization;


Начнем делать свой контрол, наследуемый от TextBox. Т.е. создадим новый класс:

public class InputDigitControl:TextBox
{
	//тут будет код :)
}


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

const int WM_PASTE = 0x0302; //Сообщение "Вставка" (через к.м. и комбинацию клавиш)
const int WM_CHAR = 0x0102; //Сообщение - нажатие алфавитно-цифровой клавиши

WM_CHAR будет отправлено форме системой только тогда, когда будет нажата алфавитно-цифровая клавиша, его будем перехватывать для отслеживания цифр (и прочего). Правда есть важный нюанс - WM_CHAR посылается и при нажатии комбинаций клавиш, например Ctrl+C и т.д., а также некоторых клавиш, которые не совсем подходят под понятие "алфавитно-цифровая", например BACKSPACE. Это надо будет учесть.

Анализ ввода с клавиатуры будем производить в функции PreProcessMessage(), которую переопределим. PreProcessMessage() вызывается для предварительной обработки входящих сообщений, и нужно будет вернуть true, если это сообщение было обработано.

Т.е. алгоритм действий таков - мы проверяем входящий символ на соответствие, и, либо пропускаем его дальше (возвращаем base.PreProcessMessage(ref msg) или false), либо что-то делаем с содержимым текстового поля, если символ нужен (это понадобится при вводе отрицательных и дробей) и возвращаем true. Или ничего не делаем, если символ нежелательный, и просто вызываем true. В последнем случае, символ просто не попадет в поле ввода, т.к. контрол будет думать, что он уже обработан.

Вставку, как я уже говорил выше, тоже нужно будет обработать, но, естественно, несколько иначе, это будем делать в переопределенной функции WndProc()
Под катом еще много )
Исходники


Контрол



Тестовое приложение

Репозиторий

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/10/c-vvod-tolko-tsifr-chisel-v-tekstovoe-pole-textbox/

Tags: ,
Гостья из будущего 2. Прикольная агитация КПРФ

Предстоящих выборов псто о няшной агитации КПРФ. КПРФ, конечно, мертвый зомби-динозавр, на последних выборах пытавшийся продвинуть Лукашенко 2.0., Грудинина, а уж крокодил Гена это вообще свистец... Но, иногда, каким-то чертом кто-то в партии находит годных креативщиков, не нового Маяковского, конечно, но тоже неплохо.

Вот, например, агитация к выборам 200-какого-то года. Замечательно сделано, хоть и наивно.



Скачать ролик с Mega.NZ (SWF+EXE)

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/08/gostya-iz-budushhego-2-prikolnaya-agitatsiya-kprf/

Чудесно

Говорите, давно искусства не было, нате вам!



Чем больше разглядываешь, тем криповее. И Лавкрафт русалку спаивает. Вот откуда он сюжеты брал :)

И Медуза, надень очки и свали - это не твоя литературная вселенная!

Картинка честно (С)пизжена неизвестно откуда.

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/08/chudesno/

Maiyahi aka Numa Numa aka O-Zone - Dragostea Din Tei

Во! Нашел ту самую "флэшку с котиками", от которой куча народа фанатела году в 200?, как и от песни, этой самой O-Zone - Dragostea Din Tei, играла же буквально из каждого утюга

Тогда не очень понимал, ще воно всіх так затягивает, а вот же, уже 5 раз пересматриваю. Горшочек, не вари (хотя вари, вари). Там явно какой-то меметический агент, похоже надо позвонить в [ДАННЫЕ УДАЛЕНЫ]. Не, никуда звонить не надо, просто нажми на реплей.



Скачать с Mega.nz (SWF+EXE)

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/04/maiyahi-aka-numa-numa-aka-o-zone-dragostea-din-tei/

C#, перехват вывода консольной программы в реальном времени из собственного приложения.

Преамбула.


Итак, необходимо перехватить в реальном времени вывод консольной программы, которая запущена собственным приложением в фоновом режиме, например, как это делает GUI Openvpn для Windows.



На моделировании формы приложения особо останавливаться не буду, сделаем там элемент управления для вывода данных, организуем возможность выбора консольного приложения или BAT/CMD-файла, вывод которого будем перехватывать, кнопки для запуска, останова внешнего приложения, и кнопку для очистки лога.

Замечу только, что для вывода перехваченных сообщений использовал немного модифицированный ListView (копия)


Главное окно основной программы


Консольные тестовые приложения и командные файлы.


Теперь надо подготовить несколько приложений для теста, одно будет консольное приложение на C#, которое генерирует случайное число, выводит его на консоль, ожидает 250 мс, и так повторяет в бесконечном цикле:

Бинарник testapp.exe
Исходный код

И несколько вариантов BAT-файлов, реализующий тот же функционал, только время ожидания составляет 1 секунду.

Правда с BAT-файлами есть пока нерешенный вопрос, некоторые, а именно в которых содержатся команды timeout и choice, при перехвате работают нестабильно. Вариант с choice зависает, начиная нагружать процессор, timeout - не выполняет свои функции, т.е. никакого таймаута, а потом зависает. Пока не понял, с чем это связано, но включил эти файлы отдельно, в комплект к тестовым

Еще одна вводная


1. В более современных версиях .NET можно использовать оператор async, но я решил обойтись без него, т.к. все возможности для перехвата данных с консоли были еще в .NET Framework 2.0. были, а слова такого не было. Как в анекдоте про Вовочку.
2. Запускать вызываемую консольную программу следует в отдельном потоке, с которым мы будем общаться как обычно - с помощью событий. Иначе чуда не получится - все будет висеть и не работать.

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

Основной класс.


Создадим новый класс, например Runner:

public class Runner

Выше класса добавляем публичный делегат (он нам потом для события понадобится)

public delegate void LogMessage(string Data);

Подключаем нужные пространства имен:

using System.Threading;
using System.Diagnostics;


Внутри класса заводим публичное свойство, определяющее путь к процессу:

public string ProcessPath { get; set; }

Заводим событие, которое будем генерировать при перехвате сообщения с консоли.

public event LogMessage LogSend;

И приватные переменные типов ProcessStartInfo, Process, для управления вызываемым процессом и типа Thread, для управления потоком, в котором будет запущен дочерний процесс.

private ProcessStartInfo Info = null;
private Process Proc = null;
private Thread t = null;


В конструкторе инициализируем переменную Info:

public Runner(string processpath)
{
    ProcessPath = processpath; //устанавливаем значение свойства ProcessPath
    Info = new ProcessStartInfo(ProcessPath);
    Info.RedirectStandardError = true; //перехват STDERR
    Info.RedirectStandardOutput = true; //перехват STDOUT
    Info.UseShellExecute = false; //иначе перехват работать не будет, см. MSDN
    Info.CreateNoWindow = true; //не запускать процесс в новом окне
                                //это скроет консоль запускаемой программы
}


Примечание: Присвоение свойству ShellExecute значения false позволяет перенаправлять потоки ввода, вывода и ошибки.

Запуск процесса и перехват вывода консоли


В функции StartProcess() непосредственно выполняем запуск процесса и перехват.

try
{
    Proc = Process.Start(Info);
}
catch (Exception ex)
{
    LogSend("INTERNAL ERROR: "+ex.Message);
    return;
}


Запускаем процесс, если произошла ошибка, вызываем событие, ответственное за отправку сообщения и выходим.

Для перехвата создаем цикл, в котором вызываем Process.StandardOutput.ReadLine(), пока результат не будет равен null.

StandardOutput.ReadLine() будет ждать, пока программа не выведет на консоль строку, и тогда вернет ее, или же вернет null, когда программа завершится.

string ConOut = "";

do
{
    ConOut = Proc.StandardOutput.ReadLine();
    if (ConOut != null)
    {
        LogSend(ConOut);
    }                

} while (ConOut != null);


Поскольку запуск этой функции вызовет "зависание", если запустить ее в основном потоке, то вызывать ее нужно в отдельном:

public void Start()
{
    t = new Thread(StartProcess);
    t.Start();
}


Ну и функция для остановки вызванного процесса:

public void Stop()
{
    if (Proc != null)
    {
        Proc.Kill();
        Proc = null;
    }

    if (t != null)
    {
        t.Abort();
        t = null;
    }
}


Основная форма


В коде основной формы создаем объект Runner, регистрируем обработчик событий, запускаем перехват, не забывая про останов по нажатию нужной кнопки:

Runner runner = null;
//...
private void btnStart_Click(object sender, EventArgs e)
{
    runner = new Runner(txtPath.Text);
    runner.LogSend += new LogMessage(runner_LogSend);            
    runner.Start();
}

private void btnStop_Click(object sender, EventArgs e)
{
    if (runner != null)
    {
        runner.Stop();
    }
}


В обработчике события отправляем данные в нужный элемент управления, не забывая про Invoke:

void runner_LogSend(string Data)
{
    Invoke((MethodInvoker)delegate
    {
        lvConsole.Items.Add(Data);
        lvConsole.EnsureVisible(lvConsole.Items.Count - 1);
    });
}


Результат



Перехват вывода из BAT-файла

Исходники


На GitHub

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/04/c-perehvat-vyvoda-konsolnoj-programmy-v-realnom-vremeni-iz-sobstvennogo-prilozheniya/

Tags: ,
Back Viewing 0 - 20