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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2013, 09:15   #11
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

перенаправление стандартных хендлов, не?
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 13.03.2013, 11:10   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Ezhik Kihze Посмотреть сообщение
перенаправление стандартных хендлов, не?
Я так понял, есть некий edit box где вводится имя программы и требуется этот box запретить на время выполнения программы. С консолью как таковой это ничего общего не имеет.
waleri вне форума Ответить с цитированием
Старый 13.03.2013, 12:02   #13
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Попытаюсь объяснить на примере ещё раз. Походу никто не понял, что мне нужно.
1. Программа при старте запускает cmd.exe с перенаправлением ввода и вывода.
2. Пользователь вводит в edit1 del /s d:\f.
3. Подтверждает (Y), что действительно хочет удалить.
4. Начинается удаление файлов и edit1 становится недоступен.
5. После удаления файлов пользователь получает запрос на удаление подкаталога Temp и edit1 должен стать доступен.
6. Пользователь подтверждает, edit1 снова становится не доступен.
7. Удаление заканчивается, cmd выводит промт, edit1 становится доступным.
Проблема в том, что я не знаю как определять момент в который нужно делать edit1 не доступным.

Цитата:
Встречный вопрос: а Вы можете узнать момент, когда оконная программа ожидает ввода?
О какой программе идё речь?

Цитата:
Вам же уже сказали, что если вам нужно запустить консольную прогу и получить ее вывод, то запускать спец. консоль вам не надо.
См. пример выше. Мне нужен не просто вывод.
Что за спец. консоль?

Цитата:
У вас путаница с терминологией.

Во первых, ваша графическая оболочка и будет консоль в этом случае.
Возможно вы правы и я путаюсь. Как моя графическая оболочка может быть консолью? Ведь мне нужно использовать cmd.exe.

Цитата:
Во вторых, некоторые программы (на свете есть не только пинг) после запуска продолжают читать данные из консоли. В качестве примера можете попробовать программу sort.exe - как это впишется в вашу концепцию вообще?
В том то и дело! Мне нужно разрешать ввод только тогда, когда программе это требуется.

Цитата:
Я так понял, есть некий edit box где вводится имя программы и требуется этот box запретить на время выполнения программы. С консолью как таковой это ничего общего не имеет.
Кажется не правильно поняли.

Последний раз редактировалось Stilet; 13.03.2013 в 14:01.
Kix.IV вне форума Ответить с цитированием
Старый 13.03.2013, 13:03   #14
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Kix.IV Посмотреть сообщение
Проблема в том, что я не знаю как определять момент в который нужно делать edit1 не доступным.
Когда запустите cmd.exe.
После завершения cmd.exe вновь разрешайте.
waleri вне форума Ответить с цитированием
Старый 13.03.2013, 14:41   #15
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Удалил. Случайно дважды отправить нажал.

Цитата:
огда запустите cmd.exe.
После завершения cmd.exe вновь разрешайте.
Т.е. при вводе команды ping cmd.exe закрывается?
Ну даже если так, что делать с del? Он ведь не запускает cmd.exe, чтобы спросить разрешение на удаление?

Долго-долго думал и понял вот что: я не правильно понял принцип работы таких приложений.

В общем, прошу помочь/подсказать, как сделать полноценный "эмулятор" cmd.exe, что бы он выглядел как cmd. Т.е. одно поле служит сразу для ввода и вывода.

Последний раз редактировалось Stilet; 13.03.2013 в 21:05.
Kix.IV вне форума Ответить с цитированием
Старый 13.03.2013, 21:20   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses    windows,
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Memo1KeyPress(Sender: TObject; var Key: char);
  private
    { private declarations }
    st:TStringList;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }
procedure ExecConsoleApp(CommandLine: AnsiString; Output: TStrings=nil; Errors:
 TStrings=nil);
var
  sa: TSECURITYATTRIBUTES;
  si: TSTARTUPINFO;
  pi: TPROCESSINFORMATION;
  hPipeOutputRead: THANDLE;
  hPipeOutputWrite: THANDLE;
  hPipeErrorsRead: THANDLE;
  hPipeErrorsWrite: THANDLE;
  Res, bTest: Boolean;
  env: array[0..100] of Char;
  szBuffer: array[0..256] of Char;
  dwNumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
begin
  sa.nLength := sizeof(sa);
  sa.bInheritHandle := true;
  sa.lpSecurityDescriptor := nil;
  CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa, 0);
  CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa, 0);
  ZeroMemory(@env, SizeOf(env));
  ZeroMemory(@si, SizeOf(si));
  ZeroMemory(@pi, SizeOf(pi));
  si.cb := SizeOf(si);
  si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  si.wShowWindow := SW_HIDE;
  si.hStdInput := 0;
  si.hStdOutput := hPipeOutputWrite;
  si.hStdError := hPipeErrorsWrite;

  (* Remember that if you want to execute an app with no parameters you nil the
     second parameter and use the first, you can also leave it as is with no
     problems.                                                                 *)
  Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, @env, nil, si, pi);

  // Procedure will exit if CreateProcess fail
  if not Res then
  begin
    CloseHandle(hPipeOutputRead);
    CloseHandle(hPipeOutputWrite);
    CloseHandle(hPipeErrorsRead);
    CloseHandle(hPipeErrorsWrite);
    Exit;
  end;
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeErrorsWrite);

  //Read output pipe
  if Output<> nil then begin
  Stream := TMemoryStream.Create;
  try
    while true do
    begin
      bTest := ReadFile(hPipeOutputRead, szBuffer, 256, dwNumberOfBytesRead,
        nil);
      if not bTest then
      begin
        break;
      end;
      Output.Append((szBuffer));
    end;
  finally
    Stream.Free;
  end;
  end;
   WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(pi.hProcess);
  CloseHandle(hPipeOutputRead);
  CloseHandle(hPipeErrorsRead);
end;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: char);
begin
  if key=#13 then begin
   ExecConsoleApp('cmd /c '+Memo1.Lines[Memo1.CaretPos.y],st,st);
   Memo1.Lines.AddStrings(st);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  st:=TStringList.Create;
  Memo1.Lines.Text:='';
  Memo1.WordWrap:=false;
  Memo1.ScrollBars:=ssAutoBoth;
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  st.Free;
end;

end.
Подходит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.03.2013, 08:34   #17
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Stilet, увы, код не работает. Консоль не запускается.
Но я понял, что он должен был сделать. Просто считать вывод консоли. Этого не достаточно.

Посмотрите то, что я прикрпепил. Это всё, что я смог сделать, но и этого не достаточно.
Вложения
Тип файла: rar Console.rar (87.0 Кб, 6 просмотров)
Kix.IV вне форума Ответить с цитированием
Старый 14.03.2013, 09:19   #18
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Консоль не запускается.
Ну не знаю... У меня все запускается и результат команд без проблем отображается (проверял на команде dir).
Цитата:
Просто считать вывод консоли. Этого не достаточно.
А что еще нужно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.03.2013, 09:29   #19
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Цитата:
Ну не знаю... У меня все запускается и результат команд без проблем отображается (проверял на команде dir).
А какая система и какая версия Delphi стоят? У меня Rad Studio XE3 на Win 7 x64.

Цитата:
А что еще нужно?
Попробуйте ввести del c:\test, предварительно создав папку test, а в ней ещё что-нибудь, и тогда станет понятно чего именно не хватает.

Up.
Может быть кто-нибудь глянет исходники и скажет, что нужно дописать. (Повторюсь, программа должна быть максимально похожа на cmd.)

Последний раз редактировалось Stilet; 17.03.2013 в 17:32.
Kix.IV вне форума Ответить с цитированием
Старый 17.03.2013, 17:29   #20
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и тогда станет понятно чего именно не хватает.
А ты не думал что я тебе код только как пример дал?
Ты в курсе что его стоит доработать - доправить получение ошибок из stderr как минимум?
Или ты думаешь что я вот так вот с потолка прожую за тебя и в рот положу?
Да код не со всеми командами работает, это только потому что я не старался все писать за тебя.
Не нравится идея - ищи другую.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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