Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.04.2009, 13:23
8shar 8shar вне форума
Прохожий
 
Регистрация: 05.04.2009
Сообщения: 6
Репутация: 10
Злость Чтение с консоли

Доброго дня. Есть программа скрин которой здесь:
http://antsa.narod.ru/img.jpg
Вверху есть рамочка, в рамочке значения давления, температуры, расхода, мне нужно их забрать от туда. Программа старая (вроде как) MSDOS, использует процесс который называется NTVDM.EXE, он является вирт.машиной, исполняющей 16-разрядные ДОС-приложения.
Все это выводиться в консоль (CMD проще говоря).
Мне позарез нужно достать от туда эти данные:
Что я УЖЕ (за 3 дня) знаю что есть:

ReadConsoleOutput
http://winapi.freetechsecrets.com/wi...soleOutput.htm
В ReadConsoleOutput функция читает характер и цвет атрибут данных из прямоугольных блоков характера клеток в буфер экрана консоли, а также функция записывает данные в прямоугольных блоков на указанном месте в буфер назначения.

ReadConsoleOutputAttribute
http://winapi.freetechsecrets.com/wi...tAttribute.htm
В ReadConsoleOutputAttribute функция копии указанного количества плана и цвет фона атрибуты из последовательных ячеек консольный буфер экрана, начиная с указанного места.


ReadConsoleOutputCharacter
http://winapi.freetechsecrets.com/wi...tCharacter.htm
В ReadConsoleOutputCharacter функция копии ряда персонажей из последовательных ячеек консольный буфер экрана, начиная с указанного места.

Я делаю:
Код:
var
 pid: DWORD;
 hStdout: thandle;
 Buffer:array of integer;
 c:coord;
 wr:cardinal;
begin
 c.X:=1;
 c.Y:=1;
 GetWindowThreadProcessId(FindWindow('C:\WINDOWS\system32\cmd.exe',nil), @pid);
 hStdout := GetStdHandle(STD_OUTPUT_HANDLE);
 ReadConsoleOutputAttribute(hStdout,@Buffer[0],2,C,Wr);

 Memo1.Lines.Add(IntToStr(buffer[0]));
 Memo1.Lines.Add(IntToStr(wr));
end;
Но не работает. Помогите пожалуйста разобраться. Мне просто позарез нужны эти цифры...
Ответить с цитированием
  #2  
Старый 05.04.2009, 14:06
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Не пользовался такими функциями, но могу предположить, что чтение аттрибута вам ненужно, если там консоль интерпретируется как экран 80х25, то имеем 4000 байт, где 2000 байт аттрибут цвета (нафик вам ненужные) и 2000 байт собственно знаки. Потому скорее всего надо использовать ReadConsoleOutputCharacter. Могу так-же предположить, что вместо Buffer:array of integer; надо сделать Buffer:array[1..2000] of byte;
Тогда по логиге из Buffer вас будет интересовать 2 и 3 строка т.е. 81-240 символы.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 05.04.2009, 14:18
8shar 8shar вне форума
Прохожий
 
Регистрация: 05.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Тогда по логиге из Buffer вас будет интересовать 2 и 3 строка т.е. 81-240 символы.
А там же есть C: coord мы задаем координаты точки откуда начинать чтение, и 2 значит сколько символов читать. Можно просто функцию написать потом ее 14 раз (по числу параметров) вызвать и записать в 14 переменных. а потом уже работать с ними.
Ответить с цитированием
  #4  
Старый 05.04.2009, 14:26
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Можно и так конечно, хотя большой разницы нет, что 14 раз вызвать функцию с нужными координами, что прочитать один раз 160 байт и обращаться к нужному элементу по индексу.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 05.04.2009, 14:58
8shar 8shar вне форума
Прохожий
 
Регистрация: 05.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

Только вопрос как получить это??!?!?!?
Ответить с цитированием
  #6  
Старый 05.04.2009, 16:50
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

У меня появилось сильное сомнение, что
Код:
 
hStdout := GetStdHandle(STD_OUTPUT_HANDLE)
правильно отрабатывает, чему равен у вас hStdout
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:04.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025