
Ладно, раскрываю карты.
Есть две вещи, позволяющие осуществить это так просто.
Я ноябре 2011 года я во время реверс-инжениринга VB6 наткнулся на кое-что интересное. Оказалось, что VB6 позволяет с помощью пары неизвестных ранее ключей C2Switches и LinkSwitches скармливать любые параметры командной строки компилятору и линкеру. Нас интересует последнее. Скормив ключ /subsystem:console линкеру, мы добьёмся того, что в генерируемых PE-файлах в качестве подсистемы будет значиться CUI-подсистема, то есть консольная подсистема, что автоматически означает создание консольного окна при запуске EXE-файла.
Но этого мало. Да, запускаемые EXE-шники будут от рождения иметь консольное окно, но чтобы в него что-то читать или писать, нужно писать много код. Придётся делать это с использованием Win32 API. Причём есть два способа работы с консолью. Во-первых это работа со стандартными потоками stdin, stdout, stderr. Это позволяет нам только читать и писать текст в потоковом режиме. И же можно работать с консолью с помощью специальных консольных API. Это позволит нам раскрашивать консоль и делать всякие интересные вещи. В любом случае, надо либо напрямую использовать API-функции, либо писать над ними обёртку.
А народ у нас, как известно, API-функций боится. Ну, или не боится, но предпочтёт набросать консольную утилиту на С/С++ или богомерзком дотнете.
Но вчера я обнаружил, что объект класса FileSystemObject поддерживает интерфейс IFileSystem3, у которого есть метод, возвращающий ссылку на интерфейс ITextStream, олицетворяющий любой из стандартных потоков (stdin, stdout, stderr). Это означает, что используя объектную модель FSO можно очень легко организовать чтение/запись из/в стандартные потоки, которые для консольного приложения ассоциированы с консольными буферами.
Это даёт нам возможность очень просто писать консольные приложения по первому типу. Поскольку доступ к консоли осуществляется через стандартные потоки, то мы можем писать консольные утилиты, которые могут принимать участие в перенаправлении вввода/вывода и в построении конвейеров.
И самое главное, что такой консольный проект скомпилируется на абсолютно любом компьютере, где установлен свежий чистый VB6. Не требуется никаких Add-In-ов, плагинов и модификаций среды/линкера. Всё только штатными средствами.
И работать такие консольные программы будут везде, где есть FSO.
И самое главное, можно писать полиморфный код, то есть код, который будет писать что-то в ITextStream, не делая разницы, пойдёт ли запись в консоль (через стандартный поток), в файл (через стандартный поток) или в файл, открытый с помощью FSO, потому что и открытый стандартный поток (который может быть перенаправлен в консоль, в чужой стандартный поток или в файл) и просто открытый файл олицетворяет один и тот же интерфейс ITextStream.
Пожалуйста, потестируйте мой кирпич и создаваемые с помощью него консольные программы — я тестировал только под Windows XP.
Ну и вообще, жду ваших отзывов, предложений, критики и замечаний.
P.S. Объявим конкурс консольных программ на VB6?
