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

Delphi и WinAPI

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

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

26.06.2016, 06:41. Просмотров 491. Ответов 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 Получение информации о выполняемых процессах
Получение хендла контрола Delphi WinAPI
Получение информации из стороннего приложения Delphi WinAPI
Delphi WinAPI Службы и приложения
Delphi WinAPI Получение координат значков на рабочем столе
Получение данных из консольного приложения Delphi WinAPI
Получение THandle собственного сервиса Delphi WinAPI
Delphi WinAPI Получение Handle открытого окна

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

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

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