Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1449479729
Limpo
2015-12-07 12:15
2017.01.15
Адрес константы внутри процедуры


2-1422510042
Смирнов А.И.
2015-01-29 08:40
2017.01.15
Копирование файла


15-1452461404
Юрий
2016-01-11 00:30
2017.01.15
С днем рождения ! 11 января 2016 понедельник


15-1450856217
Dimka Maslov
2015-12-23 10:36
2017.01.15
Я ещё сплю?


15-1455399002
Юрий
2016-02-14 00:30
2017.01.15
С днем рождения ! 14 февраля 2016 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский