Главная страница
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.02 c
4-1281052143
korbin dalas
2010-08-06 03:49
2017.01.15
Как прочитать содержимое HDD без использования файлов?


2-1432209907
Pavelnk
2015-05-21 15:05
2017.01.15
Запись в ini файл


2-1427700274
aka
2015-03-30 10:24
2017.01.15
ускорение свободного падения


1-1343890489
rioko
2012-08-02 10:54
2017.01.15
Stream.Seek Stream.Position возвращает ноль.


15-1435613404
Юрий
2015-06-30 00:30
2017.01.15
С днем рождения ! 30 июня 2015 вторник