Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Просьба оценит "корявость кода" 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 всеравно должен быть вызван.


Наверх

Титульная страница Поиск, карта сайта Написать письмо