Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 12

Интерактивная работа с консолью

03.12.2015, 19:26. Показов 3807. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех .. есть проблема
задача организовать интерактивное взаимодействие между моей программой и чужой консольной
Взаимодействие нужно именно интерактивное отправил команду получил ответ, причем сразу как только консольная программа его выдала. Если конкретно это нужно для управления консольным софтфоном.
что пробовал Каналы (pipes) проблема ответ с консоли приходит только после того, как накопится определенный объем данных, и никакими ухищрениями этого не изменить, интерактивностью тут и не пахнет.
Попробовал mailslot и ничего не получилось запускаемое приложение заканчивается с ошибкой.
вот код
Delphi
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
 
unit con_redir_mail;
interface
uses windows, sysutils;
type
  TRedirConsMailSlot = class
  private
    FnameSlotRead: string;
    FReadLocal: thandle;
    FwriteRemote: thandle;
 
    FnameSlotWrite: string;
    FwriteLocal: thandle;
    FreadRemote: thandle;
    ferr: integer;
    fpi: TProcessInformation;
    Fdir: string;
    Fapp: string;
    Fcmdline: string;
 
  public
    procedure writeconsol(s: ansistring);
    function GetMsgCount: integer;
    function GetMsgSize: dword;
    function WaitMesaage(time_out: dword): boolean;
    function ReadConsol: string;
    destructor destroy; overload;
    property dir: string read Fdir write Fdir;
    property App: string read Fapp write Fapp;
    property Cmdline: string read Fcmdline write Fcmdline;
 
    procedure inithand;
    procedure RunApp;
    constructor create;
  end;
 
implementation
 
function TRedirConsMailSlot.GetMsgSize: dword;
var
  sz, cnt: cardinal;
begin
  GetMailslotInfo(FReadLocal, nil, sz, @cnt, nil);
  if cnt <> 0 then
    result := sz
  else
    result := 0;
end;
 
procedure TRedirConsMailSlot.inithand;
var
  sa: SECURITY_ATTRIBUTES;
   tmp1:thandle;
begin
  sa.nLength := SizeOf(SECURITY_ATTRIBUTES);
  sa.bInheritHandle := True;
  sa.lpSecurityDescriptor := nil;
 
  // создаем слот через который будем читать консоль  дочернего процесса
  FnameSlotRead := '\\.\mailslot\' + inttostr(gettickcount());
  FReadLocal := CreateMailslot(pchar(FnameSlotRead), 0, MAILSLOT_WAIT_FOREVER, @sa);
 // SetHandleInformation(FReadLocal, HANDLE_FLAG_INHERIT, 0);
 
  FwriteRemote := createfile(pchar(FnameSlotRead), GENERIC_WRITE, FILE_SHARE_write or FILE_SHARE_READ , @sa, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, 0);
 SetHandleInformation(FwriteRemote, HANDLE_FLAG_INHERIT, 0);
 
 {  if not DuplicateHandle(GetCurrentProcess(), FwriteRemote,
    GetCurrentProcess(), @tmp1, 0, false, DUPLICATE_SAME_ACCESS) then
    exit;
   closehandle(fwriteremote);
   fwriteremote:=tmp1;  }
 
 
  // создаем слот через который будем писать в консоль дочернего процесса
  FnameSlotWrite := '\\.\mailslot\' + inttostr(gettickcount() + 123);
  FreadRemote := CreateMailslot(pchar(FnameSlotWrite), 0, MAILSLOT_WAIT_FOREVER, @sa);
   SetHandleInformation(FreadRemote, HANDLE_FLAG_INHERIT, 0);
 
   { if not DuplicateHandle(GetCurrentProcess(), FreadRemote,
    GetCurrentProcess(), @tmp1, 0, false, DUPLICATE_SAME_ACCESS) then
    exit;
     closehandle(FreadRemote);
     FreadRemote:=tmp1;     }
 
 
  FwriteLocal := createfile(pchar(FnameSlotWrite), GENERIC_WRITE, FILE_SHARE_write or FILE_SHARE_READ, @sa, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, 0);
  //SetHandleInformation(FwriteLocal, HANDLE_FLAG_INHERIT, 0);
end;
 
destructor TRedirConsMailSlot.destroy;
begin
 
  if FReadLocal <> 0 then
    closehandle(FReadLocal);
  if FwriteRemote <> 0 then
    closehandle(FwriteRemote);
  if FwriteLocal <> 0 then
    closehandle(FwriteLocal);
  if FreadRemote <> 0 then
    closehandle(FreadRemote);
  TerminateProcess(fpi.hProcess, 0);
  // if fpi.hThread <> 0 then
  // CloseHandle(fpi.hThread);
  if fpi.hProcess <> 0 then
    closehandle(fpi.hProcess);
 
end;
 
function TRedirConsMailSlot.GetMsgCount: integer;
var
  sz, cnt: cardinal;
begin
  GetMailslotInfo(FReadLocal, nil, sz, @cnt, nil);
  result := cnt;
end;
 
function TRedirConsMailSlot.ReadConsol: string;
var
  msz: dword;
  buf: ansistring;
begin
  result := '';
  msz := GetMsgSize();
  while msz <> 0 do
  begin
    setlength(buf, msz);
    fileread(FReadLocal, buf[1], msz);
    result := result + buf;
    msz := GetMsgSize();
  end;
end;
 
procedure TRedirConsMailSlot.RunApp;
var
  si: TStartupInfo;
begin
  inithand;
  FillChar(si, SizeOf(TStartupInfo), 0);
  si.dwFlags :=  STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES ;
  si.wShowWindow :=SW_Show; //SW_HIDE;
  si.hStdOutput := FwriteRemote;
  si.hStdError := FwriteRemote;
  si.hStdInput := FreadRemote;
 
  sleep(1000);
  if not CreateProcess(pchar(Fapp), pchar(Fcmdline), nil, nil, true, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, pchar(Fdir), si, fpi) then
  begin
    // MessageBox(0, PChar('error CreateProcess #' + IntToStr(GetLastError)), nil, MB_OK);
    ferr := 2;
    Exit;
  end;
end;
 
function TRedirConsMailSlot.WaitMesaage(time_out: dword): boolean;
var
  start_timer: uint64;
begin
  result := True;
  start_timer := gettickcount();
  while (gettickcount() - start_timer) < time_out do
  begin
    if GetMsgCount <> 0 then
    begin
      result := True;
      Exit;
    end;
 
    sleep(5);
  end;
 
end;
 
procedure TRedirConsMailSlot.writeconsol(s: ansistring);
var
  witten: cardinal;
begin
  if not writefile(FwriteLocal, s[1], length(s), witten, nil) then
    ferr := 9;
end;
 
constructor TRedirConsMailSlot.create;
begin
  FnameSlotRead := '';
  FReadLocal := 0;
  FwriteRemote := 0;
  FnameSlotWrite := '';
  FwriteLocal := 0;
  FreadRemote := 0;
  ferr := 0;
  FillChar(fpi, SizeOf(fpi), 0);
end;
 
end.
Пример использования

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 var  xx:TRedirConsMailSlot;
 ss:string;
begin
    xx:=TRedirConsMailSlot.create;
    xx.App:='D:\PRJ\Mprojects\pjsip_adapt\pipes_prj_ua\pip_vcl\tconsol.exe';
    xx.dir:='D:\PRJ\Mprojects\pjsip_adapt\pipes_prj_ua\pip_vcl\';
    xx.Cmdline:=' ';
    xx.runapp;
 
    if xx.WaitMesaage(1024*2) then
    begin
    ss :=xx.ReadConsol;
    memo1.Lines.Add(ss);
    end;
 
    xx.Free;
end
сразу после вызова функции Createprocess вызываемая программа вываливается .. что я только не делал может я упустил чтото ??
или может кто подскажет другое решение ??
уже неделю туплю ... HELP!!!!!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.12.2015, 19:26
Ответы с готовыми решениями:

Работа с консолью
Здравствуйте! Решил поработать с system() и начал делать программу, которая пишет другую программу(через system() ввожу данные и сохраняю...

Работа с консолью.
Возник у меня такой вопрос: - Можно ли вывести на экран несколько окон консолив одном приложении? Как это сделать? С выводом на нужную...

Работа с консолью
Добрый день. Нужно, чтобы при выполнении программы в консоли автоматически выполнялась вот такая строка. Подскажите как реализовать.

21
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
04.12.2015, 10:29
Студворк — интернет-сервис помощи студентам
И что ?
Нафих тебе ф-ция ExecConsoleEvent, использующая инжект ?
Она другим занимается, твоей проблемы ее функциональность вообще не касается
0
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 12
04.12.2015, 11:26  [ТС]
mss, как скажеш...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.12.2015, 11:26

работа с консолью
подскажите пожалуйсто можно ли как нибудь сделать что бы все данные с консоли при написании system(&quot;ping google.com&quot;)...

Работа с консолью
Можно ли работать с бд в конлоси. Если да то подкажите как поочерёдно лоставать из таблицы например 123 по значению Показывать его...

Работа с консолью
Проблема следующая: Дописать в конец созданного файла результаты команды, которая отображает содержимое корневого каталога.

Qt: работа с консолью
Есть ли какие-нибудь способы, что бы полноценно работать с консолью средствами Qt? Например, выводить сообщения в любом месте и разного...

Работа с консолью
Нужно: Если я напишу в консоль Process То мне выведет все процессы которые у меня на данный момент действуют. Как процессы выводить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru