Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перенаправление параметров вывода.


Михаил ©   (2004-03-19 16:31:00) 

Доброе время суток!
Подскажите пожалуйста.
Я запускаю cmd.exe
из своей программы как заставить мою программу получать результат ее работы  Т.е.,допустим, я запускаю командную строку и хочу выполнить команду dir C:\ и получить результат в свою программу.
Заранее благодарю.


Михаил   (2004-03-23 16:36:00) [1]

Суть не в параметрах time, а возможности работы с командной строкой в интерактивном режиме через мое приложение.


mdw   (2004-03-23 11:01:00) [2]

Ну, ну. Что же, обсуждение параметров команды time, очень интересная тема:))))).


RA   (2004-03-22 20:11:00) [3]

Надо же и в правду коментарии на испанском. А я и не замечал.
Попробуй вводить новое время сразу в командной строке
(по-моему в команде time допустим такой параметр - надо только посмореть). А если нужно только время вывести и сямо время не менять, то возможно в команде time и такой параметр имеется.


Gandalf   (2004-03-22 18:21:00) [4]

В народном проекте лежит и сорцами. http://kol.mastak.ru


<Falcon>   (2004-03-22 14:35:00) [5]

UGH - программа для компрессии исполняемых файлов, есть на этом сайте с исходниками.Вернее это оболочка для UPX-packer. Очень неплохая вещь. Сжимает файл примерно в 5 раз, правда в чуток загребает памяти.


Михаил   (2004-03-20 21:17:00) [6]

Gandalf что такое UGH расскажите поподробней.
Если можно примерчик.


Михаил   (2004-03-20 21:15:00) [7]

Спасибо RA ! Вот еще какой вопрос:
Если вводить команду типа cmd /c dir C:\
то все нормально код работает и выдает результат,
а если ввести допустим cmd /c time то программа повисает и видимо ждет когда я введу новое время и нажму Enter, а так как
к я ничего ввести уже не могу, то все повисает! Подскажите пожалуйста решение, а то там комментарии походу на испанском.


Gandalf   (2004-03-20 09:21:00) [8]

В UGH реализвано нечно похожее... уже под KOL


RA   (2004-03-19 19:32:00) [9]

Вот, однажды встретил такую реализацию Dos2Win v1.00 (aka
TDosMemo) by Manuel Bua:

procedure Dos2Win(CmdLine:String; OutMemo:TMemo);
const BUFSIZE = 2000;
var SecAttr    : TSecurityAttributes;
   hReadPipe,
   hWritePipe : THandle;
   StartupInfo: TStartUpInfo;
   ProcessInfo: TProcessInformation;
   Buffer     : Pchar;
   WaitReason,
   BytesRead  : DWord;
begin

with SecAttr do
begin
  nlength              := SizeOf(TSecurityAttributes);
  binherithandle       := true;
  lpsecuritydescriptor := nil;
end;
// Creazione della pipe
if Createpipe (hReadPipe, hWritePipe, @SecAttr, 0) then
begin
  Buffer  := AllocMem(BUFSIZE + 1);    // Allochiamo un buffer di dimensioni BUFSIZE+1
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  StartupInfo.cb          := SizeOf(StartupInfo);
  StartupInfo.hStdOutput  := hWritePipe;
  StartupInfo.hStdInput   := hReadPipe;
  StartupInfo.dwFlags     := STARTF_USESTDHANDLES +
                             STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := SW_HIDE;

  if CreateProcess(nil,
     PChar(CmdLine),
     @SecAttr,
     @SecAttr,
     true,
     NORMAL_PRIORITY_CLASS,
     nil,
     nil,
     StartupInfo,
     ProcessInfo) then
    begin
      // Attendiamo la fine dell'esecuzione del processo
      repeat
        WaitReason := WaitForSingleObject( ProcessInfo.hProcess,100);
        Application.ProcessMessages;
      until (WaitReason <> WAIT_TIMEOUT);
      // Leggiamo la pipe
      Repeat
        BytesRead := 0;
        // Leggiamo "BUFSIZE" bytes dalla pipe
        ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
        // Convertiamo in una stringa "\0 terminated"
        Buffer[BytesRead]:= #0;
        // Convertiamo i caratteri da DOS ad ANSI
        OemToAnsi(Buffer,Buffer);
        // Scriviamo nell' "OutMemo" l'output ricevuto tramite pipe
        OutMemo.Text := OutMemo.text + String(Buffer);
      until (BytesRead < BUFSIZE);
    end;
  FreeMem(Buffer);
  CloseHandle(ProcessInfo.hProcess);
  CloseHandle(ProcessInfo.hThread);
  CloseHandle(hReadPipe);
  CloseHandle(hWritePipe);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Dos2Win('test.bat', Memo1);
end;

Можешь переделать под свои нужды, т.к. эта штука явно под VCL.
Я пользовался, работает.


Наверх

Титульная страница Поиск, карта сайта Написать письмо