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

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

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


AlexeyTG ©   (2014-12-18 18:53:00) 

По данным ранее ( http://www.delphimaster.ru/cgi-bin/forum.pl?id=1418843283&n=18) примерам и советам реализовал код. На примера запуска CMD  с параметрами и калькулятора.

Просьба оценить "корявость" реализации

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
 System.SysUtils,
 Winapi.Windows,
 shellapi;

var
STI: TStartUpInfo;
App, Param, RunLine:String;
App2, Param2, RunLine2:String;
PI: TProcessInformation;

begin
 try
   { TODO -oUser -cConsole Main : Insert code here }
   begin
   //FillChar(STI, SizeOf(TStartUpInfo), #0);
   //FillChar(STI, SizeOf(TProcessInformation), #0);
   STI.cb := SizeOf(TStartupInfo);
   STI.dwFlags := CREATE_NO_WINDOW;
   STI.wShowWindow := SW_Show;
   App:='C:\Windows\System32\cmd.exe';
   Param:='/?';
   RunLine:=Format('"%s" %s', [App, Param]);
   App2:='C:\Windows\System32\calc.exe';
   if CreateProcess(Pointer(App), Pchar(RunLine), nil, nil, False, CREATE_NEW_CONSOLE OR NORMAL_PRIORITY_CLASS, nil, nil, STI, PI) then
     begin
       WaitForSingleObject(PI.hProcess, INFINITE);
       //ShellExecute(0, 'open','calc.exe', nil, nil, 0);
       CreateProcess(Pointer(App2), Pchar(app2), nil, nil, False, CREATE_NEW_CONSOLE OR NORMAL_PRIORITY_CLASS, nil, nil, STI, PI);
       Exit;
     end
     else exit;

   end;
 except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
 end;
end.


Вопросы:
1. При запуске видно окно программы лаунчера, как сделать, чтобы окошка приложения не было?
2.Для запуска второй программы, что лучше использовать CreateProcess или ShellExecute?
3. Какие параметры использовать, если требуется без оконный запуск приложений App, App2?

/Ну и что убрать добавить в код для его приведения в нормальный вид?


AlexeyTG   (2014-12-19 19:02:00) [1]

Приехал, снова сяду изучать. В целом разобрался вчера вроде. ПРОШУ иметь ввиду, что я не программист и впервые за много лет на днях скачал и запустил дельфи.

Проблема в том, что я не освободил хэндл потока?

2 Если я CreateProcess буду использовать только один раз за все время, есть ли смысл писать его как отдельную функцию, к примеру

Function CrProc (const ProgName, ProgParams: ShortString): boolean;

или можно просто использовать напрямую в коде? (как в примере)


Dennis I. Komarov   (2014-12-19 13:41:00) [2]


> Проблема в том, что не обнуляю (в коде нет)

Нет


AlexeyTG   (2014-12-19 00:11:00) [3]

http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988621841&n=15
Вылетает с ошибкой


AlexeyTG   (2014-12-19 00:06:00) [4]

Dennis I. Komarov ©   (18.12.14 23:10) [8]

> Сорри, а можно узнать из-за чего?

Можно, если исправить код. Я же явно на это и указываю
P.S.

Проблема в том, что не обнуляю (в коде нет)

    ZeroMemory(@si,sizeof(si));
   si.cb:=SizeOf(si)


AlexeyTG   (2014-12-19 00:01:00) [5]

Ega23Ок. С этим разобрался. Сделал так, New-> VCL Forms Application. Потом Project->Remove from project Unit1/Form1. Сохранил проект. Заново открыл его и увидел строку для кода.
program Project1;

uses
 Vcl.Forms;

{$R *.res}

begin
 Application.Initialize;
 Application.MainFormOnTaskbar := True;
 Application.Run;
end.


Как пример изменил на
program Project1;

uses
 Vcl.Forms, Vcl.Dialogs;

//{$R *.res}

begin
 ShowMessage('AllOK');
end.


Правильно?


Dennis I. Komarov   (2014-12-18 23:39:00) [6]


> AlexeyTG   (18.12.14 23:36) [13]

Вот и зря, IDE разные


Ega23   (2014-12-18 23:39:00) [7]

Хмм... Я на 2010 проверял. Ща на XE4 глянем...

Ого. А под XE4 висит...

Ну тогда окнное приложение делай, только код создания главной формы выкини.
Типа


program Project16;

uses SysUtils;
//  Vcl.Forms,
//  Unit16 in 'Unit16.pas' {Form16};
//
//{$R *.res}
//
begin
 Sleep(3000);
end.


AlexeyTG   (2014-12-18 23:36:00) [8]

Я код Ega23 один в один скопировал полность CTRL+A, Del,  CTRL+V


Dennis I. Komarov   (2014-12-18 23:34:00) [9]

Твой:
uses
 System.SysUtils,
 Winapi.Windows,
 shellapi;


и код Ega23. Найди отличия!


AlexeyTG   (2014-12-18 23:26:00) [10]

Ega23Уверен.
По шагам: File -> New -> Other -> Console Application
Весь код удаляю и копипаст кода. Окошко висит


AlexeyTG   (2014-12-18 23:13:00) [11]

Просто он у меня вообще с ошибкой вылетает, один в один код с примера


Ega23   (2014-12-18 23:13:00) [12]

Если в CreateProcess имеется ввиду, то имелось ввиду окошко лаунчера самого

Аааа... Я не догнал.
Тогда -

> MBo ©   (18.12.14 20:52) [3]
>
> убрать опцию консольной программы {$APPTYPE CONSOLE}



>  пробовал, но окошко приложения висит все равно


А ты уверен, что это окошко именно лаунчера?
По шагам: File -> New -> Other -> Console Application

Внутри:


program Project30;

uses
 SysUtils;

begin
 try
 Sleep(3000);
 except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
 end;
end.


Никаких окошек.


Dennis I. Komarov   (2014-12-18 23:10:00) [13]


> Сорри, а можно узнать из-за чего?

Можно, если исправить код. Я же явно на это и указываю
P.S.
 CreateProcess is function...


AlexeyTG   (2014-12-18 23:06:00) [14]

Сорри, а можно узнать из-за чего?

Или взять за основу предложенный ранее?
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988621841&n=15


Dennis I. Komarov   (2014-12-18 22:30:00) [15]


> у меня запускает оба нормально. RAD Studio XE7

И я про то... А вот через месяц не запустился, причем где-нить за 1000 км...


AlexeyTG   (2014-12-18 21:42:00) [16]

Dennis I. KomarovСкопировал код, у меня запускает оба нормально. RAD Studio XE7
MBoпробовал, но окошко приложения висит все равно
Ega23Если в CreateProcess имеется ввиду, то имелось ввиду окошко лаунчера самого


Dennis I. Komarov   (2014-12-18 21:01:00) [17]

Моделирую ситуация:
в результате выполнения, не запускается App2


MBo   (2014-12-18 20:52:00) [18]

убрать опцию консольной программы {$APPTYPE CONSOLE}


Ega23   (2014-12-18 20:42:00) [19]


> как сделать, чтобы окошка приложения не было?


CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS or CREATE_NO_WINDOW


brother   (2014-12-18 18:56:00) [20]

2. Если ждать не планируете, то можно ShellExecute


Наверх

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