Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
lihouzov
25 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 6
#1

Получение текущих данных с консольного приложения - Delphi WinAPI

26.06.2016, 06:41. Просмотров 512. Ответов 0
Метки нет (Все метки)

Всем добрый день, обращаюсь к специалиста, сам задачу решить не могу.
В своей программе Визуальный конструктор для микроконтроллеров решил добавить возможность внутрисхемного программирования микроконтроллеров. Для этого использую консольную утилиту avrdude.exe. Процесс программирования довольно длительный для индикации консольная утилита формирует процесс бар.
Пи вызове консольной утилиты я получаю данные только после завершения работы утилиты, мой код:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
 Output, Errors: TStringList; lp:integer; ProcessName:string;
  sa: TSECURITYATTRIBUTES;
  si: TSTARTUPINFO;
  pi: TPROCESSINFORMATION;
  hPipeOutputRead: THANDLE;
  hPipeOutputWrite: THANDLE;
  hPipeErrorsRead: THANDLE;
  hPipeErrorsWrite: THANDLE;
  DataPipeErrors,ReadPipeErrors:cardinal;
  Res, bTest: Boolean;
  env: array[0..100] of Char;
  szBuffer: array[0..256] of Char;
  dwNumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
  ires:longbool; datasize:integer;
  OldDir:string; //ChDir(PChar(kernel.PathConfigurator)+'\');    //Возвращаем исходный путь
begin
  Output:=TStringList.Create; Errors:=TStringList.Create; // Создаем
  OldDir:=GetCurrentDir;                                           //сохраняем директорию
  if Dir<>'' then  ChDir(Dir);                                     //Установить рабочую директоия
   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);
    if Dir<>'' then  ChDir(OldDir);                //Возвращаем
    result:=-2; Exit;
  end;
 
  WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeErrorsWrite);
 
  //Read output pipe
  Stream := TMemoryStream.Create;
  try
    while true do
    begin
      bTest := ReadFile(hPipeOutputRead, szBuffer, 2, dwNumberOfBytesRead,
        nil); //Здесь выполнение останавливается до завершения работы консольной программы !!!!!
      if not bTest then
      begin
        break;
      end;
      Stream.Write(szBuffer, dwNumberOfBytesRead);
    end;
    Stream.Position := 0;
    Output.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
 
  //Read error pipe
  Stream := TMemoryStream.Create;
  try
    while true do
    begin
      bTest := ReadFile(hPipeErrorsRead, szBuffer, 256, dwNumberOfBytesRead,
        nil);
      if not bTest then
      begin
        break;
      end;
      Stream.Write(szBuffer, dwNumberOfBytesRead);
    end;
    Stream.Position := 0;
    Errors.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
 
  CloseHandle(pi.hProcess);
  CloseHandle(hPipeOutputRead);
  CloseHandle(hPipeErrorsRead);
Почему когда я пытаюсь получить данные
bTest := ReadFile(hPipeOutputRead, szBuffer, 2, dwNumberOfBytesRead, nil) то выполнение программы останавливается до завершения работы консольного приложения?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2016, 06:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получение текущих данных с консольного приложения (Delphi WinAPI):

Получение данных из консольного приложения - Delphi WinAPI
Здравствуйте форумчане! Пожалуйста, подскажите . У меня такой вопрос. Я скачал примерчик из...

Запуск консольного приложения из другого приложения - Delphi WinAPI
Я понимаю, что мой вопрос уже разжеван. Однако точного ответа я пока на него не нашел. У меня есть некоторое приложение. Я хочу по...

Перехват вывода консольного приложения - Delphi WinAPI
Если попал не туда, извиняйте и перенаправьте куда надо... Всем привет, проблема в следующем: пытаюсь сделать перехват вывода консольного...

Запуск консольного приложения из формы - Delphi
Есть написанное консольное приложение {$APPTYPE CONSOLE} Вопрос в том как из обычной формы по нажатию кнопки запустить консольное? так же...

Запуск консольного приложения и результат его выполнения - Delphi WinAPI
Приветствую всех. Столкнулся со следующей проблемой. Есть консольное приложение, выполняется через командную строку, возвращает текст....

Нет связи консольного приложения с событиям динамических компонентов - Delphi
Люди как связать событие с компонентом ? program Project1; {$APPTYPE CONSOLE} {$R *.res} uses Winapi.Windows,...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2016, 06:41
Привет! Вот еще темы с ответами:

Возможно ли скрыть окно консольного приложения при его выполнении? - Delphi
Запускается консольное приложение (время отработки где то 2-3 сек). запускается из программы на delphi командой ShellExecute. Мне...

Получение информации из стороннего приложения - Delphi WinAPI
Доброго времени суток Уважаемому сообществу! Выручайте! Есть прога написанная прошлым кодером, исходники не сохранились, есть в этой...

Получение данных из XML - Delphi
Добрый день! Есть XML файл с информацией. Вот небольшой фрагмент его кода: &lt;TextAssetInfo&gt; ...

Получение системных данных PC - Delphi
Est takoj voprosik.Pozvolaet li Delphi rabotat s sistemoj.Toest uznat temperaturu CPU,zagruzka Ram,Koli4estvo oborotov kullera i...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru