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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2016, 22:37   #1
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию Чтение из буфера результата cmd

Необходимо выполнить чтение из буфера результата cmd, делаю следующее:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  s:TStringList;
  i: integer;
begin
  s:=TStringList.Create;
  Clipboard.AsText:='';
  WinExec('cmd /c net user |clip',SW_SHOWNORMAL);
  S.Text:= Clipboard.AsText;
  for I := 0 to s.Count-1 do
    Memo1.Lines.Add(s[i]);
  s.Free;
end;
В результате Memo пустое, но в буфере есть необходимая инфа, по Ctrl+V выводится. Что делаю не так?
Replicant вне форума Ответить с цитированием
Старый 20.10.2016, 23:27   #2
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Получается я читаю буфер еще до его заполнения. Т.е. надо как-то остановить выполнение обработчика до закрытия окна cmd, затем вернуть управление обработчику, но как это реализовать?
sleep не предлагать, не вариант.
Replicant вне форума Ответить с цитированием
Старый 20.10.2016, 23:35   #3
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

А вы попробуйте так
Код:
Memo1.Text:=S.Text;
Или вообще
Код:
Memo1.Text:=Clipboard.AsText;
Ну и после WinExec можно "на всякий пожарный" вставить
Код:
Application.ProcessMessages;

Последний раз редактировалось kropotkina-alice; 20.10.2016 в 23:39.
kropotkina-alice вне форума Ответить с цитированием
Старый 21.10.2016, 07:43   #4
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
А вы попробуйте так
Я это все первым делом пробовал, забыл об этом упомянуть, не работает все это. Причина описана в моем втором посту, как обойти?
Replicant вне форума Ответить с цитированием
Старый 21.10.2016, 07:50   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А не проще читать нормальным способом?
http://stackoverflow.com/questions/9...o-a-delphi-app

или запускать mycmdprogram > file.txt
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.10.2016, 08:06   #6
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А не проще читать нормальным способом?
http://stackoverflow.com/questions/9...o-a-delphi-app

или запускать mycmdprogram > file.txt
С файлом та же проблема, создается позже чем начинается считывание, а за ссылку спасибо, работает.
Replicant вне форума Ответить с цитированием
Старый 21.10.2016, 08:13   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так конечно надо ждать пока завершится. CreateProcess + WaitForSingleObject
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.10.2016, 08:17   #8
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так конечно надо ждать пока завершится. CreateProcess + WaitForSingleObject
Собственно об этом я и спрашивал.
Replicant вне форума Ответить с цитированием
Старый 21.10.2016, 10:26   #9
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Тогда вот так:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var si: Tstartupinfo;
    p: Tprocessinformation;
begin
 FillChar( Si, SizeOf( Si ) , 0 );
 with Si do begin
  cb := SizeOf( Si);
  dwFlags := startf_UseShowWindow;
  wShowWindow := 4; //если не надо показывать окно, то =2
 end;
 Createprocess(nil,'cmd /c net user |clip',nil,nil,false,Create_default_error_mode,nil,nil,si,p);
 Waitforsingleobject(p.hProcess,infinite);
 Memo1.Text:=Clipboard.AsText;
end;

Последний раз редактировалось kropotkina-alice; 21.10.2016 в 10:48.
kropotkina-alice вне форума Ответить с цитированием
Старый 21.10.2016, 11:40   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,218
По умолчанию

Можно взять такую функцию:
Код:
function CmdExec(const Cmd: string): Integer;
// Выполнение консольного приложения с ожиданием его завершения и возвратом кода возврата
var
  Rlst: LongBool;
  StartUpInfo: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  ExitCode: Cardinal;
begin
  FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0); // заполнение структуры нулями
  with StartUpInfo do
  begin
    cb := SizeOf(TStartUpInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    wShowWindow := SW_SHOWNORMAL;
  end; {with}
  Rlst := CreateProcess(
      nil,
      PChar(Cmd), // команда
      nil,
      nil,
      False, // флаг наследования текущего процесса
      NORMAL_PRIORITY_CLASS, // флаги способов создания процесса
      nil,
      nil, // текущий диск и каталог
      StartUpInfo, // структура STARTUPINFO
      ProcessInfo // структура PROCESS_INFORMATION
    );
  if Rlst then begin // если запуск прошел успешно
    with ProcessInfo do begin
      WaitForInputIdle(hProcess, INFINITE); // ждем завершения инициализации
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE); // ждем завершения процесса
      GetExitCodeProcess(ProcessInfo.hProcess, ExitCode); // получаем код завершения
      CloseHandle(hThread); // закрываем дескриптор процесса
      CloseHandle(hProcess); // закрываем дескриптор потока
    end; {with}
  end else begin // ошибка выполнения команды
    WriteLn('Error: ', GetLastError, ' > ', Cmd);
    ExitCode := 0;
  end; {if}
  Result := Integer(ExitCode); // возвращаем код возврата с приведением к типу Integer
end; {func CmdExec}
И использовать ее вместо WinExec. Она еще и код возрата возвращает.
Arigato вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
cmd. частично не работает отключение вывода результата выполнения команды goluzov Общие вопросы C/C++ 1 06.12.2012 12:10
чтение из буфера. panek C# (си шарп) 2 31.05.2012 19:31
чтение и запись результата в фаил.C++ Александра89 Помощь студентам 0 25.11.2011 00:38
Вывод результата в cmd Windows Aleksandr_Yanov PHP 3 10.11.2010 15:26
Socket / Доступ к буферу чтения сокета / Чтение из буфера bwwebm Работа с сетью в Delphi 1 29.04.2010 10:42