![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Просьба оценит "корявость кода" v3
AlexeyTG © (2014-12-19 23:34:00)На основе
Заново переписал Просьба оценить "корявость кода" v2
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1419009922&n=18
и подсказок, а также показанных Rouse_ © примерах, который уделил мне часть СВОЕГО ВРЕМЕНИ в выходной день и дал хорошие примеры, внес изменения в v2 код.
Убрал все, что связанно с кодами ошибок (их просмотр не нужен в принципе), если ЕХЕшник запускаемого не найден, просто закрыть приложение.
Перенес CloseHandle в саму функцию. Заменил
CreateProcess(PChar(ProgName),Pchar(CmdLine),nil,nil,False,NORMAL_PRIORI TY_CLASS,nil,nil,StartInf,ProcInf);
на
CreateProcess(nil, PChar('"' + ProgName + '" ' + ProgParams), nil, nil, False, 0, nil, nil, StartInf, ProcInf);
и сделал мелкие поправки.
Просьба глянуть, есть ли здесь "ошибки":
program Project1;
uses
Winapi.Windows,
System.SysUtils;
{$R *.res}
function RunApp (const ProgName, ProgParams: String): boolean;
Var
StartInf: TStartupInfo;
ProcInf: TProcessInformation;
begin
ZeroMemory(@StartInf,sizeof(StartInf));
StartInf.cb:=SizeOf(StartInf);
CreateProcess(nil, PChar('"' + ProgName + '" ' + ProgParams), nil, nil, False, 0, nil, nil, StartInf, ProcInf);
CloseHandle(ProcInf.hThread);
Result := WaitForSingleObject(ProcInf.hProcess, INFINITE )=WAIT_OBJECT_0;
if Result then CloseHandle(ProcInf.hProcess);
end;
begin
if not RunApp('C:\Windows\System32\notepad.exe','D:\1.txt') then exit;
if not RunApp('C:\Windows\System32\notepad.exe','D:\2.txt') then exit;
end.
AlexeyTG (2014-12-20 20:35:00) [1]Так вроде же закрываю хендлы в функции.
CloseHandle(ProcInf.hThread);
WaitForSingleObject(ProcInf.hProcess, INFINITE );
CloseHandle(ProcInf.hProcess);
Хотел спросить, в таком виде (20.12.14, 00:55) код нормальный, не "глючный"?
AlexeyTG (2014-12-20 20:35:00) [2]Удалено модератором
Примечание: Дубль
Германн (2014-12-20 04:11:00) [3]
> brother © (20.12.14 03:50) [12]
Ужо "сто лет" назад Ю.З. всё сказал,
Хендл на hThread нафиг не нужен после (а может быть и до) вызова CreateProcess.
brother (2014-12-20 03:50:00) [4]CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
Германн (2014-12-20 03:47:00) [5]
> brother © (20.12.14 03:26) [10]
>
> ну и бонус тогда:
> http://www.transl-gunsmoker.ru/2011/08/undocumented-createprocess.
> html
> обратите внимание на закрытие хэндлов...
>
О каких конкретно хендлах ты говоришь?
brother (2014-12-20 03:26:00) [6]ну и бонус тогда:
http://www.transl-gunsmoker.ru/2011/08/undocumented-createprocess.html
обратите внимание на закрытие хэндлов...
brother (2014-12-20 03:18:00) [7]зы. на хинты и варнинги при компиляции стоит обращать внимание...
brother (2014-12-20 03:18:00) [8]а сорри, увидел инициализацию...
brother (2014-12-20 03:15:00) [9]теперь result не инициализирован...
> if not
нельзя так...
AlexeyTG (2014-12-20 00:55:00) [10]:) точно
program Project1;
uses
Winapi.Windows,
System.SysUtils;
{$R *.res}
function RunApp (const ProgName, ProgParams: String): boolean;
Var
StartInf: TStartupInfo;
ProcInf: TProcessInformation;
begin
ZeroMemory(@StartInf,sizeof(StartInf));
StartInf.cb:=SizeOf(StartInf);
Result:=CreateProcess(nil, PChar('"' + ProgName + '" ' + ProgParams), nil, nil, False, 0, nil, nil, StartInf, ProcInf);
CloseHandle(ProcInf.hThread);
WaitForSingleObject(ProcInf.hProcess, INFINITE );
CloseHandle(ProcInf.hProcess);
end;
begin
if not RunApp('C:\Windows\System32\notepad.exe','D:\1.txt') then exit;
if not RunApp('C:\Windows\System32\notepad.exe','D:\2.txt') then exit;
end.
Rouse_ (2014-12-20 00:49:00) [11]Конечно не открывает, тыж теперь результат не возвращаешь.
AlexeyTG (2014-12-20 00:30:00) [12]Inovet ©Просто подумал так "читабельней" будет. Первая темавчера, это вообще попытка не разобравшись нахрапом из примеров код состряпать. Вторая тема, с нуля вручную написанный код. Ну и третья бета вариант
Inovet (2014-12-20 00:23:00) [13]А зачем 3 раза одну тему создавать без причин?
AlexeyTG (2014-12-20 00:06:00) [14]Rouse_ ©Хех :)
ZeroMemory(@StartInf,sizeof(StartInf));
StartInf.cb:=SizeOf(StartInf);
CreateProcess(nil, PChar('"' + ProgName + '" ' + ProgParams), nil, nil, False, 0, nil, nil, StartInf, ProcInf);
CloseHandle(ProcInf.hThread);
WaitForSingleObject(ProcInf.hProcess, INFINITE );
CloseHandle(ProcInf.hProcess);
Просто таким образом он второй ЕХЕшник не открывает :(
Rouse_ (2014-12-19 23:57:00) [15]Ну вот, не зря решил на форум глянуть ибо опять у тебя ошибка :)
Чтож ты прошляпил закрытие хэндла процесса?
Result вполне может быть не true, но CloseHandle всеравно должен быть вызван.