На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Прочитать Console из Windows , WIndows Console
    Прочитать Console из Windows

    ...Пипл:
    ...уменя есть программа - консольная!
    ...Запущенна из Windows!
    ...Я узнаю ее HWND и THandle,
    ...мне нужно в TMemo или TStrings, передавать каждую секунду текстовое изображение находящиеся в
    ДАHHОМ открытом консольном приложении!?!??!

    ERrorMAKros
      А Вы ее сами запускаете, или кто-то из вне. Если сами, то можете переназначить ее в/в на Pipe'ы и вычитывать оттуда все что она выводит. Правда это не со всеми программами проходит, но с большинством все Ok. Если надо, могу рассказать поподробнее.
        Расскажи Петрович )
          ...Да вообщем - дело вот в чем! ...в Windows запустили консольное приложение, ...появилось стандартное окошко, а котором определенная DOS программа (в текстовом режиме). Задача вот какая: ...Нужен исходник, который перехватит весь вид консольного окна и переместит его, скажем в TMemo. Т.е. весь текст в консольном приложении загнать в какую нибудь текстовую переменную, ...например TStrings! ...перехват текста! ...ну-же! ...программеры! ....давайте, поднажмите! ...вы же знаете!

          P.S. Я получил HWND консольного окна, ....получил THandle! ...Даже ProcessID получил (потому, что консольную программу запускал из своего приложения путем createprocess). ...А дальше, все что в модуле windows, типа GetConsoleScreenBufferInfo или ReadConsole - тут уже не знаю что делать!!!!


          HEEEElp!!
            Значится так.
            Есть такая библиотека, называется JVCL. Там есть компонент TJvCreateProcess Он-то и позволяет запускать DOS-приложения, и ксонсольные Win-приложения. При этом, он перехватывает весь вывод таких приложений, порождая соответствующие события. Более того, он даже позволяет посылать данные на вход таких приложений. В общем очень не плохой компонет. Правда сама библиотека JVCL весьма громоздка, и если требуется толко этот компонент проще выдернуть его модуль из библиотеки. Я использую его даже не устанавливая JVCL в Delphi, правда сам компонент создаю динамически, на этапе исполнения.
            Есть нечто попроще, называется DosCommand (брал по моему на torry). Это компонент живущий в отдельном модуле и для инсталяции ничего особенного не требующий. Однако, реализация этого компонент изобилует ошибками. Я в свое время на основе этого компонента создал свой, где вроде исправил все найденные мной ошибки. Однако, до полного завершения над компонентом работа не была доведена и учитывая то, что это было давно, я даже не уверен, все-ли ошибки я исправил unsure.gif . В общем есть старый текст моего компонента и тестовая программа которая позволяет воспользоваться любым из трех перечисленных компонентов. Если есть желание, могу кинуть, сами разбирайтесь rolleyes.gif .
            Но, не все так просто и красиво как кажется на первый взгляд. sad.gif
            Насколько я помню, когда я разбирался со всем эти хозяйством то столкнулся с проблемой для которой не нашел универсального решения, в связи с чем и забросил работу на компонентом.
            Проблема в следующем:
            При работе под WinXP (и кажется под Win2k), при запуске DOS-приложения, через любой из указанных компонентов, не перехватывается го потоки! Причем, перехват в/в консольных Win-приложений проблем не вызывает. Под Won9x все нормально. На сколько я смог разобраться проблема состоит в том, что эмулятор DOS для WinXP (cmd.exe) не совсем корректно передает потоки в/в запускаемому приложению.
            Выход из положения есть. Если запускать DOS-приложение не напрямую, а через BAT-файл, то все получается. Например, если хочется запустить DOS-прогрммку 'Вася.exe' то запускать надо не ее, а файл 'Вася.bat' который должен содержать строку 'Вася.exe'. В этом случае, Cmd.exe ведет себя иначе, и все получается. Мне этот способ не нравится, хотя в частных случаях вполне применим.
            Да, и еще. Перехватить в/в консольной программы (в том-числе и DOS-программы) можно только в том случае если эта программа пользуется стандартными потоками в/в. Например, написанные на Borland Pascal программы (если они используют модуль CRT или подобные), по умолчанию не пользуются стандартными потоками. Чтобы они ими пользовались, надо в них сделать кое-что дополнительно. Проверить любую, выводящую строки, программу на выполнение этого условия можно элементарно. Например мы хотим проверить программу Вася.exe. Если мы знаем, что эта программа выводит некоторый текст и завершается при указании опции /? то, просто набираем коммандную строку (либо в TC, либо в пуск->выполнить) вида:
            Вася.exe /? >петя.txt

            После завершения программы смотрим содержимое файла "петя.txt" Если там пусто, то программа не пользуется стандартными потоками, и перехват ее вывода описанным выше способом невозможен sad.gif . Если-же там то, что вывела программа, то радуйтесь.
            Ну ладно, на первый раз хватит rolleyes.gif
              Цитата (Петрович @ 1.12.03, 01:28)
              . Если-же там то, что вывела программа, то радуйтесь.

              for Петрович
              Выводит в файл но через поток никак у меня не получается
              может на мыло пошлеш
              Сообщение отредактировано: Bas -
                Цитата
                Bas, 1.12.03, 19:01
                Выводит в файл но через поток никак у меня не получается
                может на мыло пошлеш

                Вышлю, но наверное только завтра смогу (03.12.03).
                  Очень извиняюсь. Поднял архив, и понял что мой модуль в "разобранном", недоделанном состоянии. Поэтому рекомендую пока воспользоваться JVCL, модуль JvSysComp, компонент TJvCreateProcess. Правда в него надо внести исправление:
                  В конструкторе 'constructor TJvReadThread.Create(AReadHandle, ADestHandle: THandle);'
                  нужно закоментировать строку: 'Priority := tpLower;'.
                  Если этого не сделать, поток TJvReadThread имеет приоритет ниже чем созданный процесс. Поэтому, если запускаемый процесс здорово "жрет" процессор (что характерно для DOS-программ), то потоку TJvReadThread иногда процессор вообще не достается. Проявляется это в том, что "перехвата" стандартного потока вывода иногда (у меня почти всегда) не происходит.

                  И еще, напомню. Под WinNT, Win2k и WinXP DOS-программы приходится запускать через BAT-файл (см. мое сообщение от 1.12.03, 02:28).
                  Сообщение отредактировано: Петрович -
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0288 ]   [ 16 queries used ]   [ Generated: 27.04.24, 07:48 GMT ]