Вверх ↑
Ответов: 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;



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

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