![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Просьба оценит "корявость кода"
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