Форум: "Начинающим";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
ВнизПросьба оценит "корявость кода" Найти похожие ветки
← →
AlexeyTG (2014-12-18 18:53) [0]По данным ранее (http://delphimaster.net/view/2-1418843283/) примерам и советам реализовал код. На примера запуска 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?
/Ну и что убрать добавить в код для его приведения в нормальный вид?
← →
brother © (2014-12-18 18:56) [1]2. Если ждать не планируете, то можно ShellExecute
← →
Ega23 © (2014-12-18 20:42) [2]
> как сделать, чтобы окошка приложения не было?CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS or CREATE_NO_WINDOW
← →
MBo © (2014-12-18 20:52) [3]убрать опцию консольной программы {$APPTYPE CONSOLE}
← →
Dennis I. Komarov © (2014-12-18 21:01) [4]Моделирую ситуация:
в результате выполнения, не запускается App2
← →
AlexeyTG (2014-12-18 21:42) [5]Dennis I. Komarov Скопировал код, у меня запускает оба нормально. RAD Studio XE7
MBo пробовал, но окошко приложения висит все равно
Ega23 Если в CreateProcess имеется ввиду, то имелось ввиду окошко лаунчера самого
← →
Dennis I. Komarov © (2014-12-18 22:30) [6]
> у меня запускает оба нормально. RAD Studio XE7
И я про то... А вот через месяц не запустился, причем где-нить за 1000 км...
← →
AlexeyTG (2014-12-18 23:06) [7]Сорри, а можно узнать из-за чего?
Или взять за основу предложенный ранее?
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988621841&n=15
← →
Dennis I. Komarov © (2014-12-18 23:10) [8]
> Сорри, а можно узнать из-за чего?
Можно, если исправить код. Я же явно на это и указываю
P.S.
CreateProcess is function...
← →
Ega23 © (2014-12-18 23:13) [9]
Если в 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.
Никаких окошек.
← →
AlexeyTG (2014-12-18 23:13) [10]Просто он у меня вообще с ошибкой вылетает, один в один код с примера
← →
AlexeyTG (2014-12-18 23:26) [11]Ega23 Уверен.
По шагам: File -> New -> Other -> Console Application
Весь код удаляю и копипаст кода. Окошко висит
← →
Dennis I. Komarov © (2014-12-18 23:34) [12]Твой:
uses
System.SysUtils,
Winapi.Windows,
shellapi;
и код Ega23. Найди отличия!
← →
AlexeyTG (2014-12-18 23:36) [13]Я код Ega23 один в один скопировал полность CTRL+A, Del, CTRL+V
← →
Ega23 © (2014-12-18 23:39) [14]Хмм... Я на 2010 проверял. Ща на XE4 глянем...
Ого. А под XE4 висит...
Ну тогда окнное приложение делай, только код создания главной формы выкини.
Типа
program Project16;
uses SysUtils;
// Vcl.Forms,
// Unit16 in "Unit16.pas" {Form16};
//
//{$R *.res}
//
begin
Sleep(3000);
end.
← →
Dennis I. Komarov © (2014-12-18 23:39) [15]
> AlexeyTG (18.12.14 23:36) [13]
Вот и зря, IDE разные
← →
AlexeyTG (2014-12-19 00:01) [16]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.
Правильно?
← →
AlexeyTG (2014-12-19 00:06) [17]Dennis I. Komarov © (18.12.14 23:10) [8]
> Сорри, а можно узнать из-за чего?
Можно, если исправить код. Я же явно на это и указываю
P.S.
Проблема в том, что не обнуляю (в коде нет)
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si)
← →
AlexeyTG (2014-12-19 00:11) [18]http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988621841&n=15
Вылетает с ошибкой
← →
Dennis I. Komarov © (2014-12-19 13:41) [19]
> Проблема в том, что не обнуляю (в коде нет)
Нет
← →
AlexeyTG (2014-12-19 19:02) [20]Приехал, снова сяду изучать. В целом разобрался вчера вроде. ПРОШУ иметь ввиду, что я не программист и впервые за много лет на днях скачал и запустил дельфи.
Проблема в том, что я не освободил хэндл потока?
2 Если я CreateProcess буду использовать только один раз за все время, есть ли смысл писать его как отдельную функцию, к примеруFunction CrProc (const ProgName, ProgParams: ShortString): boolean;
или можно просто использовать напрямую в коде? (как в примере)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.055 c