Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2013, 19:43   #21
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Цитата:
А ты не думал что я тебе код только как пример дал?
Понятно, что пример.
Цитата:
Ты в курсе что его стоит доработать - доправить получение ошибок из stderr как минимум?
Или ты думаешь что я вот так вот с потолка прожую за тебя и в рот положу?
Да код не со всеми командами работает, это только потому что я не старался все писать за тебя.
Я и не просил за меня сделать. Чуть выше я выложил всё что смог сделать, там уже реализован ввод и вывод, можно и чтение из stdErr добавить легко. Даже можно "отвечать" на запросы от команд типа del.
Всё, что мне нужно - это сделать её похожей на cmd, так что бы отличить нельзя. Именно это я не знаю как сделать и прошу помощи на форуме.
Kix.IV вне форума Ответить с цитированием
Старый 17.03.2013, 19:46   #22
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Т.е. тебе цвета нужно подобрать?
Ничего не понимаю, если у тебя все есть то что еще нужно?
Ладно, другой вопрос: Ты делаешь оконку? верно? А почему не сделать консольную программу, но свою? Тогда и схожесть не придется подбирать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.03.2013, 20:24   #23
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Цитата:
Т.е. тебе цвета нужно подобрать?
Ну цвета подобрать не трудно, на скрине уже версия с подобранными шрифтами и размерами.

Цитата:
Ладно, другой вопрос: Ты делаешь оконку? верно? А почему не сделать консольную программу, но свою? Тогда и схожесть не придется подбирать.
Мне надо будет кое-что изменить. Консоль не подходит.

Цитата:
Ничего не понимаю, если у тебя все есть то что еще нужно?
Вот смотрите, что будет если ввести два раза подряд без остановки ping localhost в cmd и в моей оболочке:

Получается, что cmd адекватно воспринимает ввод при выполнении команды, а моя оболочка нет. И я не знаю как это исправить.

Последний раз редактировалось Kix.IV; 18.03.2013 в 10:43.
Kix.IV вне форума Ответить с цитированием
Старый 18.03.2013, 10:44   #24
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Перезалил, теперь лучше видно.
Вот ещё один скрин:

Здесь я зажал Enter.

Последний раз редактировалось Kix.IV; 18.03.2013 в 10:53.
Kix.IV вне форума Ответить с цитированием
Старый 18.03.2013, 15:39   #25
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Kix.IV Посмотреть сообщение
И я не знаю как это исправить.
cmd.exe читает данные все время и пересылает их на стандартный ввод процесса. Если процесс не читает, все остается в буфере и будет прочитано следующим процессом.

Это уже упоминалось, ищите redirect stdin/stdout и CreatePipe()
waleri вне форума Ответить с цитированием
Старый 18.03.2013, 15:57   #26
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
cmd.exe читает данные все время и пересылает их на стандартный ввод процесса. Если процесс не читает, все остается в буфере и будет прочитано следующим процессом.
Пробовал уже. Отсылал каждый введёный символ с клавиатуры, но так и не смог добится работы backspace и delete(Вместо стирания появляется что-то непонятное). Может быть подскажите, что нужно сделать? Вот так оно выглядит:


Цитата:
Это уже упоминалось, ищите redirect stdin/stdout и CreatePipe()
Искал уже, ничего толкового не нашёл.
Kix.IV вне форума Ответить с цитированием
Старый 18.03.2013, 17:30   #27
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

А backspace/delete сами работать не будут... ктото должен делать редакцию командной строки. Обычно консоль считывает строку до Enter и тогда шлет на вход. Например попробуйте запустить sort.exe из cmd.exe
waleri вне форума Ответить с цитированием
Старый 18.03.2013, 18:27   #28
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Цитата:
А backspace/delete сами работать не будут... ктото должен делать редакцию командной строки. Обычно консоль считывает строку до Enter и тогда шлет на вход. Например попробуйте запустить sort.exe из cmd.exe
Вы меня не поняли. Я имел в виду, как мне удалить символы из буфера. Если послать в буфер Backspace или Delete, то вместо удаления добавятся новые.
Сейчас я пытаюсь реализовать это через ReadFile. Он ведь удаляет прочитанное.
UPD:Пытался прочитать все 4 хендла:
CA.hStdInputWr - возвращает в буфере "Error 5".
CA.hStdInputRd - виснет, при чём на PeekNamedPipe.
CA.hStdOutputWr - возвращает в буфере "Error 5".
CA.hStdOutputRd - возвращает вывод консоли.

Последний раз редактировалось Kix.IV; 18.03.2013 в 18:45.
Kix.IV вне форума Ответить с цитированием
Старый 18.03.2013, 20:17   #29
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

А зачем PeekNamedPipe? Это для named pipes, вам такое не надо.
Вам нужен обычный CreatePipe() + ReadFile() + WriteFile()
waleri вне форума Ответить с цитированием
Старый 19.03.2013, 12:56   #30
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

PeekNamedPipes использую для получения размера буфера, т.к. если использовать ReadFile на пустом буфере, то программа ждёт пока он наполнится(зависает на веки). Может быть предложите другой способ чтения(что бы работал и на буфере ввода)?
Сейчас читаю так:
PHP код:
const  BUFSIZE 1024;

type
  TCA 
record
    hStdInputWr
hStdInputRdhStdOutputWrhStdOutputRdTHandle;
    
hProcessTHandle;
    
CmdLineWideString;
    
dwProcessIdCardinal;
  
end;
.....
function 
ReadCA(CATCA): AnsiString;
var
  
Buf: array [1..BUFSIZEof AnsiChar;
  
rdBufCardinal;
begin
  Result 
:= '';
  
PeekNamedPipe(CA.hStdOutputRdnil0nil, @rdBufnil);
  if 
rdBuf 0 then Exit;
  if 
not ReadFile(CA.hStdOutputRdBufBUFSIZErdBufnilthen
  begin
    Result 
:= 'Error: ' IntToStr(GetLastError);
    Exit;
  
end;
  
OemToAnsi(@Buf, @Buf);
  
Result := Copy(Buf1rdBuf);
end
UPD: Хоть функия называется PeekNamedPipes, она нормально работает(и должна) для анонимных пайпов. Пруф: "Copies data from a named or anonymous pipe into a buffer without removing it from the pipe."

Последний раз редактировалось Kix.IV; 19.03.2013 в 13:00.
Kix.IV вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
консоль (ввод животное-вывод год) luser-user C# (си шарп) 5 13.02.2013 18:54
masm32 консоль посимвольный ввод Bytyava Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 02.11.2012 10:55
Ввод и вывод строковых данных на консоль BlackFantom Общие вопросы по Java, Java SE, Kotlin 1 16.12.2011 04:14
Ввод и вывод строковых данных на консоль turtles Общие вопросы по Java, Java SE, Kotlin 1 26.09.2011 05:06