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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2011, 18:28   #1
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию Выполнение команд MS Dos

Как сделать чтобы при вводе досовских команд в memo они выполнялись и их результат выводился с в memo
Aleksandr вне форума Ответить с цитированием
Старый 17.09.2011, 18:50   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Что-то было похожее http://programmersforum.ru/showthread.php?t=160111
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.09.2011, 18:55   #3
Surgeon
Форумчанин
 
Регистрация: 04.10.2007
Сообщений: 106
По умолчанию

Цитата:
Сообщение от Aleksandr Посмотреть сообщение
Как сделать чтобы при вводе досовских команд в memo они выполнялись и их результат выводился с в memo
В DelphiWorld есть статьи "Как захватить весь вывод в консоли" и "Запустить консольное приложение и получить его стандартный вывод"
Все не так плохо, как вам кажется, на самом деле все гораздо хуже.
http://delphiworld.narod.ru/dw.html - 5000 статей!!! удобный поиск, оффлайн сборник, рекомендую всем
Surgeon вне форума Ответить с цитированием
Старый 18.09.2011, 03:39   #4
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Код:
function RunCMD(Comand: String):string;
const BUFSIZE = 2000;
var SecAttr: TSecurityAttributes;
    hReadPipe, hWritePipe: THandle;
    StartupInfo: TStartUpInfo;
    ProcessInfo: TProcessInformation;
    Buffer: Pchar;
    WaitReason,BytesRead: DWord;
    ts:string;
BEGIN
result:='';
 with SecAttr do
  begin
   nlength:= SizeOf(TSecurityAttributes);
   binherithandle:= true;
   lpsecuritydescriptor:= nil;
  end;
 if Createpipe(hReadPipe, hWritePipe, @SecAttr, 0) then
  begin
   Buffer:= AllocMem(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(Comand), @SecAttr, @SecAttr, true, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
    begin
     repeat
      WaitReason:= WaitForSingleObject( ProcessInfo.hProcess,100);
      Application.ProcessMessages;
     until(WaitReason <> WAIT_TIMEOUT);
     repeat
      BytesRead := 0;
      ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
      Buffer[BytesRead]:= #0;
      //OemToAnsi(Buffer,Buffer);
      ts:=String(Buffer);
      result := result+ts;
     until(BytesRead < BUFSIZE);
    end;
   FreeMem(Buffer);
   CloseHandle(ProcessInfo.hProcess);
   CloseHandle(ProcessInfo.hThread);
   CloseHandle(hReadPipe);
   CloseHandle(hWritePipe);
  end;
END;
функция совместима с дельфями до 2006

далее где юникод там надо бубен,

вот эта же но с бубном. Для Embarcadero XE

Код:
// запуск консоли
function RunCMD(comand: String):string;
const BUFSIZE = 2000;
var SecAttr: TSecurityAttributes;
    hReadPipe, hWritePipe: THandle;
    StartupInfo: TStartUpInfo;
    ProcessInfo: TProcessInformation;
    Buffer: PAnsichar;
    WaitReason,BytesRead: DWord;
begin  // start
 with SecAttr do
  begin
   nlength:= SizeOf(TSecurityAttributes);

   binherithandle:= true;
   lpsecuritydescriptor:= nil;
  end;
 if Createpipe(hReadPipe, hWritePipe, @SecAttr, 0) then
  begin
   Buffer:= AllocMem(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;
   comand:=comand+'.exe'; // бубен без него не работает
// смысл бубна в обязательном наличии любых изменений перемменной comand чтобы компилятор видел
   if CreateProcess(nil, PWideChar(comand), @SecAttr, @SecAttr, true, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
    begin
    result:='';
     repeat
      WaitReason:= WaitForSingleObject( ProcessInfo.hProcess,100);
      Application.ProcessMessages;
     until(WaitReason <> WAIT_TIMEOUT);
     repeat
      BytesRead := 0;
      ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
      Buffer[BytesRead]:= #0;
      //OemToAnsi(Buffer,Buffer);
      result := result + String(Buffer);
     until(BytesRead < BUFSIZE);
    end;
   FreeMem(Buffer);
   CloseHandle(ProcessInfo.hProcess);
   CloseHandle(ProcessInfo.hThread);
   CloseHandle(hReadPipe);
   CloseHandle(hWritePipe);
  end;
end;
и еще в win xp консоль выдает кодировку windows-1251 а Windows 7 выдает в OEM
Lesha вне форума Ответить с цитированием
Старый 18.09.2011, 10:42   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
и еще в win xp консоль выдает кодировку windows-1251 а Windows 7 выдает в OEM
ой, не буду утверждать 100%, но мне кажется, что Вы заблуждаетесь.
Консоль всегда, ещё со времён Win 3.x и Windows 9x всегда работала в кодировке OEM (866).

p.s. мой комментарий не относится к программному коду - что там и в какой кодировке отдаётся - не знаю...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.09.2011, 12:04   #6
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

не просто действиельно написал прогу которая через команду ipconfig получает данные, так вот в xр там ansi а в 7 oem

можете проверить банальным экспортом команды в текстовый файл

C:\Documents and Settings\Lesha>ipconfig > c:\1.txt
Lesha вне форума Ответить с цитированием
Старый 19.09.2011, 01:13   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, так это проблема исключительно программы ipconfig! (в Windows XP она выводит действительно в ANSI)

попробуйте, например, команды
Код:
dir > dddd.txt
Код:
copy sddfxxs sd sd > 222.txt
Код:
ping tt > ping2.txt
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.09.2011, 13:30   #8
Стелс
Я с вами :-)
Форумчанин
 
Аватар для Стелс
 
Регистрация: 19.10.2008
Сообщений: 110
По умолчанию

а чо такое "БУБЕН" ???
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга - Окна for чайников . Кодить начал ещё вчера . ......кто там кодит ? Да не кто не кодит это я куякнулся
Стелс вне форума Ответить с цитированием
Старый 19.09.2011, 13:46   #9
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от Стелс Посмотреть сообщение
а чо такое "БУБЕН" ???
Музыкальный инструмент.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 20.09.2011, 11:01   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
а чо такое "БУБЕН" ???
угу. Tronix абсолютно прав.
Просто этот музыкальный инструмент часто используется в шаманских камланиях,
а иногда в программировании без них не обойтись
Пара плясок с бубном вокруг кода и вуаля - всё работает!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение команд MS DOS Aleksandr Общие вопросы Delphi 4 08.07.2011 14:08
Indy Telnet выполнение команд Kigmatig Работа с сетью в Delphi 0 27.03.2011 23:21
Выполнение команд с правами root-a из .net приложения Arnezami Операционные системы общие вопросы 1 08.04.2010 10:46
Выполнение команд находящихся в файле .txt SwitchOFF PHP 6 29.10.2009 00:30
Выполнение команд Vovilnik Свободное общение 14 06.05.2009 19:22