Главная страница
    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.064 c
15-1456747091
MsGuns
2016-02-29 14:58
2017.01.15
Кто мы есть ?


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


3-1311085051
yurikon
2011-07-19 18:17
2017.01.15
Сколько памяти занимает SQLEXPRESS


4-1266266901
Pavel
2010-02-15 23:48
2017.01.15
Перевод в "спящий" режим


3-1311683275
Patrick1968
2011-07-26 16:27
2017.01.15
Интересная вещь в ADO





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский