Форум программистов, компьютерный форум CyberForum.ru

Delphi и WinAPI

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

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

26.06.2016, 06:41. Просмотров 502. Ответов 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) то выполнение программы останавливается до завершения работы консольного приложения?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2016, 06:41     Получение текущих данных с консольного приложения
Посмотрите здесь:

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

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

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

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

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

Получение хендла контрола - Delphi WinAPI
Delete

Получение параметров для консольного приложения - C#
есть задание, Input s n NAME p nr cost r

Получение параметров при запуске консольного приложения - C++
Допустим, есть некоторый test.exe int _tmain(int argc, _TCHAR* argv) { setlocale(LC_ALL, &quot;Russian&quot;); for (int i = 0; i &lt; argc;...

Получение в реальном времени возврата от консольного приложения с использованием WaitForExit(); - C#
Вроде и тема уже изъезженная и вдоль и поперек, но что то не могу дать ладу уже два вечера. Есть функция: private bool wimlib(string...

Получение текущих координатов курсора - JavaScript
На странице есть графический элемент. Как мне при кликаньи на нем выводить координаты курсора относительно этого графического...

Получение текущих процессов windows - C++ WinAPI
Здравствуйте, как можно получить текущие процессы windows и занимаемые ими объемы памяти? Погуглил, но некоторые способы кривые: не...

Подключение к Access из консольного приложения MVS2012 и выборка данных c выводом в консоль - C++
Пусть есть таблица TestDB c единственной таблицей Table_1 с двумя полями: ключевым текстовым полем key и числовым полем data. Задача...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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