![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Заново переписал Просьба оценить "корявость кода" v2
AlexeyTG © (2014-12-19 20:25:00)Не стал в тупую копировать куски кода и т.п. как вчера когда быстро нахрапом хотел сделать. Сел почитал, написал заново код. Пожалуйста, гляньте насколько он в данный момент "нормальный"
program Project1;
uses
Vcl.Forms, Winapi.Windows, System.SysUtils;
Var
StartInf: TStartupInfo;
ProcInf: TProcessInformation;
CmdLine: String;
{$R *.res}
function RunApp (const ProgName, ProgParams: String): boolean;
begin
ZeroMemory(@StartInf,sizeof(StartInf));
StartInf.cb:=SizeOf(StartInf);
CmdLine:=Format('"%s" %s', [ProgName, ProgParams]);
Result:=CreateProcess(PChar(ProgName),Pchar(CmdLine),nil,nil,False,NORMAL_PRIORI TY_CLASS,nil,nil,StartInf,ProcInf);
end;
begin
If RunApp('C:\Windows\System32\cmd.exe','/?') then
begin
CloseHandle(ProcInf.hThread);
WaitForSingleObject(ProcInf.hProcess, INFINITE );
CloseHandle(ProcInf.hProcess);
RunApp('C:\Windows\System32\notepad.exe','D:\1.txt');
CloseHandle(ProcInf.hThread);
CloseHandle(ProcInf.hProcess);
Application.Terminate;
end;
end.
Rouse_ (2014-12-19 21:04:00) [21]
> Так ошибок не будет никогда (обратите внимание на расстановку
> кавычек и пробелов). А если вы его не укажете - у вашей
> программы могут быть серьёзные проблемы с безопасностью.
> Особенно, если вы не используете кавычки.
Заключи в кавычки путь к ПО, об этом написано как в MSDN так и с приведенной тобой статье.
> так нормально будет? :)
Нет, конечно :)
Да и вообще убери Application.Terminate - зачем он тут тебе?
AlexeyTG (2014-12-19 20:57:00) [22]кгшзхвот тут вы меня в тупик поставиили, если их параметрами делать, то какие значения им передавать при вызове функции.
AlexeyTG (2014-12-19 20:55:00) [23]1. По первому парметру прочитал здесь http://www.gunsmoker.ru/2009/07/createprocess.html
Application := 'C:\Program Files\MySoft\MyApp.exe';Так ошибок не будет никогда (обратите внимание на расстановку кавычек и пробелов). А если вы его не укажете - у вашей программы могут быть серьёзные проблемы с безопасностью. Особенно, если вы не используете кавычки.
Params := '-n:6 /p5 "C:\Program Files\MySoft\Data.bin"';
CmdLine := Format('"%s" %s', [Application, Params]);
CreateProcess(PChar(Application), PChar(CmdLine), ...);
И на другом ресурсе где обсуждали.
2. экзешник не сетапер, простое приложение, именно для него пишется лаунчер, на нем работает вроде нормально.
3, 4 begin
If RunApp('C:\Windows\System32\cmd.exe','/?') then
begin
CloseHandle(ProcInf.hThread);
WaitForSingleObject(ProcInf.hProcess, INFINITE );
CloseHandle(ProcInf.hProcess);
RunApp('C:\Windows\System32\notepad.exe','D:\1.txt');
CloseHandle(ProcInf.hThread);
CloseHandle(ProcInf.hProcess);
Application.Terminate;
end else Application.Terminate
так нормально будет? :)
Rouse_ (2014-12-19 20:48:00) [24]1. Первый параметр, передаваемый CreateProcess избыточен.
2. Это все не сработает на экзешниках от сетаперов от InstallShield, т.е. ты дождешся только завершения работы экзешника, а не того кода, который он запустит далее на исполнение.
3.Если файл, который ты хочешь запустить будет не найден, то CloseHandle под отладчиком сгенерирует ошибку (штатоное поведение на невалидный хэндл в процессе отладки).
4. Как я понял коды возврата будет анализировать Пушкин?
кгшзх (2014-12-19 20:34:00) [25]убрать глобальные переменные
и сделать их праметрами.