Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как написать эмулятор командной строки, эмулятор командной строки 
:(
    Опции темы
_sten_
Дата 7.12.2006, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: нет
Всего: 3



Помогите пожалуста написать эмулятор командной строки

Добавлено @ 22:50 
 smile 
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
Snowy
Дата 7.12.2006, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



А зачем эмулятор?
Просто вызываем коммандную строку и всё...
Если не подходит, то какой должен быть функционал и интерфейс?
PM MAIL   Вверх
_sten_
Дата 8.12.2006, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: нет
Всего: 3



Весь цинус в том что надо эмулятор.... smile
А интерфейс приблизительно такой: в Edit вводим команду и смотрим результат выполнения в MEMO

ЗЫ:
Вариант типа 
WinExec('cmd /c ping 127.0.0.1 >file1.txt',sw_hide);
Memo1.Lines.LoadFromFile('file1.txt');
не предлагать!
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
Romikgy
Дата 8.12.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



имхо перенаправление вывода и ввода те поможет


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 8.12.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



http://vingrad.ru/DELPHI-DLP-000823
Или ты собираешься выполнять собственные комманды, а не функционал коммандной строки Windows?
PM MAIL   Вверх
_sten_
Дата 9.12.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: нет
Всего: 3



Спасибо за ссылку, ето именно то что я искал!
Я зделал так:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function GetDosOutput(const CommandLine:string): string;    
var    
  SA: TSecurityAttributes;    
  SI: TStartupInfo;    
  PI: TProcessInformation;    
  StdOutPipeRead, StdOutPipeWrite: THandle;    
  WasOK: Boolean;    
  Buffer: array[0..255] of Char;    
  BytesRead: Cardinal;    
  WorkDir, Line: String;    
begin    
  Application.ProcessMessages;    
  with SA do    
  begin    
    nLength := SizeOf(SA);    
    bInheritHandle := True;    
    lpSecurityDescriptor := nil;    
  end;    

  CreatePipe(StdOutPipeRead,  
             StdOutPipeWrite, 
             @SA,           
             0              
             );    
  try    
    
    with SI do    
    begin    
      FillChar(SI, SizeOf(SI), 0);    
      cb := SizeOf(SI);    
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;    
      wShowWindow := SW_HIDE;    
      hStdInput := GetStdHandle(STD_INPUT_HANDLE);
      hStdOutput := StdOutPipeWrite;    
      hStdError := StdOutPipeWrite;    
    end;    

    WorkDir := ExtractFilePath(CommandLine);    
    WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, PChar(WorkDir), SI, PI);    
   
    CloseHandle(StdOutPipeWrite);    

    if not WasOK then    
      raise Exception.Create('Could not execute command line!')    
    else    
      try    

        Line := '';    
        repeat    
  
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);        
          if BytesRead > 0 then    
          begin    
    
            Buffer[BytesRead] := #0;        
            Line := Line + Buffer;    
          end;    
        until not WasOK or (BytesRead = 0);    
        WaitForSingleObject(PI.hProcess, INFINITE);    
      finally    
        CloseHandle(PI.hThread);    
        CloseHandle(PI.hProcess);    
      end;    
  finally
      result:=Line;
      CloseHandle(StdOutPipeRead);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text := GetDosOutput('C:\WINDOWS\system32\cmd.exe /c ping 127.0.0.1');

end;

end.

с Англиским все в порядке, а вот вместо руского пишет каккуето ересь!!!
Как быть?

Пытался конвертонуть функцией:
Код

function DosToWin(St: string): string;
var    
  Ch: PChar;    
begin    
  Ch := StrAlloc(Length(St) + 1);
  OemToAnsi(PChar(St), Ch);
  Result := Ch;    
  StrDispose(Ch)    
end;

но безполезно !!!
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
naxellar
Дата 11.1.2007, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 11.1.2007

Репутация: нет
Всего: нет



Напиши просто функцию соответствия ASCII и ANSI. smile 
PM MAIL   Вверх
iNV
Дата 12.1.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 22.6.2006

Репутация: нет
Всего: нет



Код

function DosToWin(St: string): string;
var    
  Ch: PChar;    
begin    
  Ch := StrAlloc(Length(St) + 1);
  OemToAnsi(PChar(St), Ch);
  Result := Ch;    
  StrDispose(Ch)    
end;


Эта функция у меня работает :-/
PM MAIL   Вверх
Pentium02
Дата 26.3.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 29.4.2006
Где: Россия

Репутация: нет
Всего: 1



А есть чтонибудь получше? Чтоб текст в мемо кидался строчка за строочкой, вот например запустил ты пинг 127.0.0.1 и надо ждать пока приложение завершиться чтоб увидеть его результат, а нельзяли видеть как оно выполняется?
PM MAIL WWW ICQ   Вверх
Snowy
Дата 27.3.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Код

            Line := Line + Buffer; 
            Memo1.Text := Line;

PM MAIL   Вверх
Anakin
  Дата 24.6.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



Кто то может подробней написать как сделать что бы данная функция работала в РеалТайм
Вот Pentium02 задал вопрос.
Тут как я вижу Snowy дал ответ но чтото у меня не получаетса.. Я не понимаю куда нуна вставить этот код. (( КТо то может сказать как это сделать.. Очень нуна.. уже неделю мучаюсь ничего не получаетса (
PM MAIL   Вверх
Snowy
Дата 25.6.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Найди в исходном коде строку
Код
Line := Line + Buffer; 

Добавь после неё
Код
Memo1.Text := Line;
Application.ProcessMessages;

PM MAIL   Вверх
Anakin
Дата 25.6.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 25.9.2006

Репутация: нет
Всего: нет



2 Snowy Огромное тебе спасибо выручил.
Если можно ещё один вопрос глупый.
Я запустил всё работает.
НО теперь необходимо остановить эту функцию.
Тоесть что то вроде кнопки СТОП
Я пробовал 
Код

Application.Free;
Application.Destroy;

Но они тока уничтожают приложение. А мне необходимо что бы оно просто остановило функцию.
Надеюсь можно дать и на этот глупый вопрос ответ..
Зарание благодарен.
Ещё раз спосибо 2 Snowy
PM MAIL   Вверх
Snowy
Дата 25.6.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Exit или Break
PM MAIL   Вверх
grafed
Дата 24.4.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 24.4.2008

Репутация: нет
Всего: нет



Всем добрый день ! всё, конечно, отлично работает с выводом ...

Но встала такая проблема : если я запускаю консольную программу, то вывод происходит в Memo, но как только программа выдаёт запрос на ответ типа: "Файл уже существует. перезаписать? All <A> Exit <E> Yes <Y>", то всё на этом и виснет...

Так вот по этому поводу вопрос: "А возможно ли реализовать обратнуюю операцию - отправку символов в консольное приложение ?" 

                                  Заранее благодарен за внимание. Павел
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1085 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.