Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Заново переписал Просьба оценить "корявость кода" v2


Страницы:   1 2

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]

убрать глобальные переменные
и сделать их праметрами.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо