Вверх ↑
Этот топик читают: Гость
Ответов: 31
Рейтинг: 0
#1: 2017-12-28 22:40:26 ЛС | профиль | цитата
Обнаружил очередные недоработки (ошибки) в компоненте WinExec.
В режиме запуска консольного процесса не работают:

1) точка с данными об ID процесса
2) выбор режима отображения консольного окна

Прошу внести, предлагаемые мной, изменения в процедуру THIWinExec._work_doConsoleExec в файле hiWinExec.pas, которые устраняют замеченные недостатки. Предлагаемые изменения в процедуре выделяю красным:


procedure THIWinExec._work_doConsoleExec;
var
sa: TSECURITYATTRIBUTES;
si: TSTARTUPINFO;
pi: TPROCESSINFORMATION;
Res: Boolean;
CommandLine:string;
FN,params:string;
begin
Fn := ReadString(_Data,_data_FileName,_prop_FileName);
Params := ReadString(_Data,_data_Params,_prop_Param);
CommandLine := Fn + ' ' + Params;

Terminate;

sa.nLength := sizeof(sa);
sa.bInheritHandle := true;
sa.lpSecurityDescriptor := nil;

CreatePipe(hPipeInputRead, hPipeInputWrite, @sa, 0);
CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa, 0);
CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa, 0);

ZeroMemory(@si, SizeOf(si));
ZeroMemory(@pi, SizeOf(pi));

si.cb := SizeOf(si);
si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

[s]si.wShowWindow := SW_HIDE;[/s]// удалить
//заменить на
[color=#CC3300][b]si.wShowWindow := _prop_Mode;[/b][/color]// обеспечивает заданный пользователем
//режим отображения окна консоли

si.hStdInput := hPipeInputRead;
si.hStdOutput := hPipeOutputWrite;
si.hStdError := hPipeErrorsWrite;

Res := CreateProcess(nil, PChar(CommandLine), nil, nil, true,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi);

// Procedure will exit if CreateProcess fail
if not Res then
begin
CloseHandle(hPipeInputRead);
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeErrorsWrite);
CloseHandle(hPipeInputWrite);
CloseHandle(hPipeOutputRead);
CloseHandle(hPipeErrorsRead);
hProcess := 0;
Exit;
end;

hProcess := pi.hProcess; FRead := true;


[color=#CC3300][b]FProcessID := pi.dwProcessId; [/b][/color]
// добавить. Исправляет отсутствие данных об ID процесса


hReadThread := CreateThread(nil,1024,@ReadFunc,Self,0,dwReadThreadID);

_hi_onEvent(_event_onExec);
end;



Изменения элементарные, но обеспечивают нормальное функционирование компонента.

Редактировалось 1 раз(а), последний 2017-12-28 22:42:21
карма: 0

0
Ответов: 4
Рейтинг: 0
#2: 2018-10-06 08:50:32 ЛС | профиль | цитата
А почему могуть быть краши программы при направлении в winexec на консоль? Если делать на стандартную точку, крашей нет. Но тогда нет возможности обрабатывать то, что выводиться в консоль (выводить в отдельное окно и прочее)
карма: 0
PSPx.RU Team
0
Ответов: 4630
Рейтинг: 749
#3: 2018-10-08 10:40:45 ЛС | профиль | цитата
kichrot писал(а):
Прошу внести, предлагаемые мной, изменения
Поддерживаю.
in1975 писал(а):
краши программы при направлении в winexec на консоль
А более подробно? Чтение консоли и события onConsoleXXX происходят в параллельном потоке, могут быть проблемы при совместном доступе к данным.
карма: 26

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#4: 2018-10-08 15:40:48 ЛС | профиль | цитата
Netspirit писал(а):
Поддерживаю.

Обновил на SVN, проверяйте.
карма: 22

0
Ответов: 4630
Рейтинг: 749
#5: 2018-10-08 17:04:59 ЛС | профиль | цитата
С датой в комментарии таки промахнулся Как по мне, так вообще с комментариями, не влияющими на понимание кода, заморачиваться не стоит - лишь текста добавляют. Для отслеживания изменений есть SVN (а более подробное описание изменений в сообщении журнала - желательно).

Редактировалось 1 раз(а), последний 2018-10-08 17:07:12
карма: 26

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#6: 2018-10-08 17:44:47 ЛС | профиль | цитата
Netspirit писал(а):
С датой в комментарии таки промахнулся

Ешкин кот, точно, там же 11-й месяц я поставил, а сейчас только 10-й. Так исправить, или так и оставить, или вообще убрать?
карма: 22

0
Ответов: 4630
Рейтинг: 749
#7: 2018-10-08 17:49:14 ЛС | профиль | цитата
Да убери её - зачем она там?
карма: 26

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#8: 2018-10-09 12:35:03 ЛС | профиль | цитата
Netspirit писал(а):
Да убери её - зачем она там?

Убрал
карма: 22

0
Ответов: 4
Рейтинг: 0
#9: 2018-10-11 11:40:50 ЛС | профиль | цитата
вот такая ошибка, если направлять в консоль

могу схему кинуть, если надо

Редактировалось 1 раз(а), последний 2018-10-11 11:44:10
карма: 0
PSPx.RU Team
0
Ответов: 4630
Рейтинг: 749
#10: 2018-10-11 11:52:57 ЛС | профиль | цитата
Там же русским языком написано - ошибка в MathParser. Разбирайся какие данные ты ему подал. И все равно не понятно что значит "направлять в консоль".

Редактировалось 1 раз(а), последний 2019-05-16 10:59:45
карма: 26

0
Ответов: 4630
Рейтинг: 749
#11: 2018-12-28 14:44:54 ЛС | профиль | цитата
Многострадальный WinExec

Очередная переработка - дошли руки до работы с консольными приложениями в этом компоненте. Меня давно коробил имеющийся там код (в том числе, и по стилю "курица лапой").
Предлагаю:

1) Корректно работает определение завершения работы консольной программы, в т.ч bat-файла. Выдаётся событие onConsoleTerminate, заполняется точка ExitCode.
2) По doConsoleExec выдаются события onExec/onErrorExec, заполняется точка ProcessID
3) Добавлен метод doConsoleDetach - отключиться от консольной программы без её завершения. Например, если нужно запустить программу, передать ей консольный ввод и завершиться, а она пусть работает себе. Правда, многие программы в таком случае могут просто завершать работу, так как им уже нечего ждать с консольного ввода (предполагаю, обычно это интерактивные программы, плотно работающие с вводом пользователя - та же cmd.exe).
При завершении родительской программы запущенная консольная теперь не убивается по Terminate, а от нее просто отключаемся (не надо висеть обеим программам, пока консольная отработает. А с не работавшим определением завершения консольной программы это был просто капец).

WinExec mod 1-6.zip

Редактировалось 3 раз(а), последний 2019-01-11 18:25:22
карма: 26

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#12: 2018-12-28 15:01:54 ЛС | профиль | цитата
Так надо это обновлять как новый релиз или не надо, или это альтернативный мод?
карма: 22

0
Ответов: 4630
Рейтинг: 749
#13: 2018-12-28 15:06:19 ЛС | профиль | цитата
Нет, кроме добавленного одного метода там всё остальное совместимо. Только добавления и улучшения. Консольный код переработан полностью.
Если уже скачал - качни ещё раз: сделал небольшую поправку.

Редактировалось 1 раз(а), последний 2018-12-28 15:08:27
карма: 26

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#14: 2018-12-28 15:24:59 ЛС | профиль | цитата
Netspirit писал(а):
Если уже скачал - качни ещё раз: сделал небольшую поправку.

Какую по счету, или уже все, это последняя?

Редактировалось 1 раз(а), последний 2018-12-28 15:25:26
карма: 22

0
Ответов: 4630
Рейтинг: 749
#15: 2018-12-28 15:25:49 ЛС | профиль | цитата
Вроде все
карма: 26

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)