Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.01.15;
Скачать: CL | DM;

Вниз

Просьба оценит "корявость кода" v3   Найти похожие ветки 

 
AlexeyTG   (2014-12-19 23:34) [0]

На основе
Заново переписал Просьба оценить "корявость кода" v2
http://delphimaster.net/view/2-1419009922/
и подсказок, а также показанных 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.


 
Rouse_ ©   (2014-12-19 23:57) [1]

Ну вот, не зря решил на форум глянуть ибо опять у тебя ошибка :)
Чтож ты прошляпил закрытие хэндла процесса?
Result вполне может быть не true, но CloseHandle всеравно должен быть вызван.


 
AlexeyTG   (2014-12-20 00:06) [2]

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);

Просто таким образом он второй ЕХЕшник не открывает :(


 
Inovet ©   (2014-12-20 00:23) [3]

А зачем 3 раза одну тему создавать без причин?


 
AlexeyTG   (2014-12-20 00:30) [4]

Inovet © Просто подумал так "читабельней" будет. Первая тема вчера, это вообще попытка не разобравшись нахрапом из примеров код состряпать. Вторая тема, с нуля вручную написанный код. Ну и третья бета вариант


 
Rouse_ ©   (2014-12-20 00:49) [5]

Конечно не открывает, тыж теперь результат не возвращаешь.


 
AlexeyTG   (2014-12-20 00:55) [6]

:) точно

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.


 
brother ©   (2014-12-20 03:15) [7]

теперь result не инициализирован...

> if not

нельзя так...


 
brother ©   (2014-12-20 03:18) [8]

зы. на хинты и варнинги при компиляции стоит обращать внимание...


 
brother ©   (2014-12-20 03:18) [9]

а сорри, увидел инициализацию...


 
brother ©   (2014-12-20 03:26) [10]

ну и бонус тогда:
http://www.transl-gunsmoker.ru/2011/08/undocumented-createprocess.html
обратите внимание на закрытие хэндлов...


 
Германн ©   (2014-12-20 03:47) [11]


> brother ©   (20.12.14 03:26) [10]
>
> ну и бонус тогда:
> http://www.transl-gunsmoker.ru/2011/08/undocumented-createprocess.
> html
> обратите внимание на закрытие хэндлов...
>

О каких конкретно хендлах ты говоришь?


 
brother ©   (2014-12-20 03:50) [12]

CloseHandle(PI.hProcess);
   CloseHandle(PI.hThread);


 
Германн ©   (2014-12-20 04:11) [13]


> brother ©   (20.12.14 03:50) [12]

Ужо "сто лет" назад Ю.З. всё сказал,
Хендл на hThread нафиг не нужен после (а может быть и до) вызова CreateProcess.


 
AlexeyTG   (2014-12-20 20:35) [14]

Так вроде же закрываю хендлы в функции.

CloseHandle(ProcInf.hThread);
WaitForSingleObject(ProcInf.hProcess, INFINITE );
CloseHandle(ProcInf.hProcess);


Хотел спросить, в таком виде (20.12.14, 00:55) код нормальный, не "глючный"?


 
AlexeyTG   (2014-12-20 20:35) [15]

Удалено модератором
Примечание: Дубль



Страницы: 1 вся ветка

Текущий архив: 2017.01.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
15-1452881433
xayam
2016-01-15 21:10
2017.01.15
Приглашаю на шахматный турнир Delphi Masters 4 (2016)


1-1346053086
mefodiy
2012-08-27 11:38
2017.01.15
Настройка Delphi 2010


6-1256640553
Encore
2009-10-27 13:49
2017.01.15
Post/get неверная кодировка


15-1448919001
Юрий
2015-12-01 00:30
2017.01.15
С днем рождения ! 1 декабря 2015 вторник


2-1422528000
Алексей_П
2015-01-29 13:40
2017.01.15
Размер TForm