Форум: "Начинающим";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
ВнизПросьба оценит "корявость кода" 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.052 c