Włodzimierz Zylbertal

Włodzimierz Zylbertal badacz, wynalazca,
doradca,
popularyzator,
nauczyciel, pu...

Temat: program z linii komend bez okienka DOS-a?

No właśnie. Użyłem najbardziej uniwersalnego w Lazarusie sposobu wieloplatformowego:

procedure zewnertrzny(apka, param1, param2, param3, param4);
var AProcess: TProcess;
begin
AProcess:=TProcess.Create(nil);
Aprocess.Executable:=apka;
AProcess.Parameters.Add(param1);
AProcess.Parameters.Add(param2);
AProcess.Parameters.Add(param3);
AProcess.Parameters.Add(param4);
Aprocess.Options:=AProcess.Options+[poWaitOnExit];
AProcess.Execute;
AProcess.Free;
end;

"Apka" to program uruchamiany z linii komend, który nie ma "trybu cichego", zawsze coś tam wypisuje po zakończeniu zadania. Czy można go jakoś "uciszyć", żeby nie był widoczny w trakcie
działania?Ten post został edytowany przez Autora dnia 22.10.14 o godzinie 13:01

konto usunięte

Temat: program z linii komend bez okienka DOS-a?

Aprocess.Options:=AProcess.Options + [poWaitOnExit, poNoConsole];
Włodzimierz Zylbertal

Włodzimierz Zylbertal badacz, wynalazca,
doradca,
popularyzator,
nauczyciel, pu...

Temat: program z linii komend bez okienka DOS-a?

Dzięki! Przeryłem FreePascal Wiki i wyraźnie przeoczyłem... :-)
Włodzimierz Zylbertal

Włodzimierz Zylbertal badacz, wynalazca,
doradca,
popularyzator,
nauczyciel, pu...

Temat: program z linii komend bez okienka DOS-a?

... tylko, że po zastosowaniu poNoConsole całość przestaje działać :-(
Programem uruchamianym jest crypt.exe - do szyfrowania plików. I, co ciekawe, podobnie zachowuje się Lazarus, gdy w sekcji AProcess.Executable wpiszę np 'crypto.bat', czyli batcha ze wszystkimi paramterami. Gdy nie ma poNoConsole, batch działa, gdy poNoConsole jest, działać przestaje.

konto usunięte

Temat: program z linii komend bez okienka DOS-a?

Włodzimierz Z.:
... tylko, że po zastosowaniu poNoConsole całość przestaje działać :-(
Programem uruchamianym jest crypt.exe - do szyfrowania plików. I, co ciekawe, podobnie zachowuje się Lazarus, gdy w sekcji AProcess.Executable wpiszę np 'crypto.bat', czyli batcha ze wszystkimi paramterami. Gdy nie ma poNoConsole, batch działa, gdy poNoConsole jest, działać przestaje.

http://wiki.freepascal.org/Executing_External_Programs
Nie próbowałem, ale z tego co tam wyczytałem wynika, że w przypatku
bat/cmd procesem jest cmd.exe, czy tam inny command.com :)
Brzmi sensownie nawet. W każdym razie - wtedy jako proces trzeba
podać cmd.exe, a bat jest pierwszym parametrem. Pewnie trzeba jakoś
powiadomić go jakoś, że te parametry to ten skrypt ma dostać... :)
Włodzimierz Zylbertal

Włodzimierz Zylbertal badacz, wynalazca,
doradca,
popularyzator,
nauczyciel, pu...

Temat: program z linii komend bez okienka DOS-a?

Do Lazarusa zrobiono potężne biblioteki szyfrantów: DCPCiphers i DCPHashes. Mam je zainstalowane, ale nie chciało mi się zgłębiać ich od fundamnetów. No i moje lenistwo ukarano źle działającą, lub niedziałającą procedurą :-(

konto usunięte

Temat: program z linii komend bez okienka DOS-a?

Michał Z.:
http://wiki.freepascal.org/Executing_External_Programs
Nie próbowałem, ale z tego co tam wyczytałem wynika, że w przypatku
bat/cmd procesem jest cmd.exe, czy tam inny command.com :)
Brzmi sensownie nawet. W każdym razie - wtedy jako proces trzeba
podać cmd.exe, a bat jest pierwszym parametrem. Pewnie trzeba jakoś
powiadomić go jakoś, że te parametry to ten skrypt ma dostać... :)

Ale po co w ogóle używać plików wsadowych? Przecież sama aplikacja konsolowa (tutaj crypt.exe) odpalana z tego procesu powinna funkcjonować. Można by też kontrolować jej działanie przy użyciu potok, wysyłając to co wyświetla (o ile w ogóle wyświetla jakieś powiadomienia) do jakichś kontrolek TMemo.

Używałem z powodzeniem TProcess do odpalania gbak.exe celem tworzenia backupów baz danych firebird i tak naprawdę nie rozumiem gdzie tu jest tak naprawdę problem. Na podstawie samej wklejonej tu procedury też nie zawsze można za wiele zdiagnozować.

konto usunięte

Temat: program z linii komend bez okienka DOS-a?

Właśnie testowałem i tak:

w pliku lfm:


object Form1: TForm1
Left = 235
Height = 300
Top = 140
Width = 415
Caption = 'Form1'
ClientHeight = 300
ClientWidth = 415
LCLVersion = '1.0.14.0'
object btnGo: TButton
Left = 304
Height = 25
Top = 256
Width = 75
Caption = 'Go'
OnClick = btnGoClick
TabOrder = 0
end
object edtInFile: TFileNameEdit
Left = 11
Height = 21
Top = 32
Width = 349
FilterIndex = 0
HideDirectories = False
ButtonWidth = 23
NumGlyphs = 0
MaxLength = 0
TabOrder = 1
end
object edtOutFile: TFileNameEdit
Left = 11
Height = 21
Top = 80
Width = 349
FilterIndex = 0
HideDirectories = False
ButtonWidth = 23
NumGlyphs = 0
MaxLength = 0
TabOrder = 2
end
object Label1: TLabel
Left = 11
Height = 14
Top = 8
Width = 48
Caption = 'Input file:'
ParentColor = False
end
object Label2: TLabel
Left = 11
Height = 14
Top = 56
Width = 56
Caption = 'Output file:'
ParentColor = False
end
object rgAction: TRadioGroup
Left = 8
Height = 73
Top = 112
Width = 129
AutoFill = True
Caption = 'Action'
ChildSizing.LeftRightSpacing = 6
ChildSizing.TopBottomSpacing = 6
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 1
ClientHeight = 55
ClientWidth = 125
ItemIndex = 0
Items.Strings = (
'encrypt'
'decrypt'
)
TabOrder = 3
end
object Label3: TLabel
Left = 160
Height = 14
Top = 112
Width = 23
Caption = 'Key:'
ParentColor = False
end
object edtKey: TEdit
Left = 160
Height = 21
Top = 136
Width = 224
TabOrder = 4
Text = 'edtKey'
end
object Process1: TProcess
Active = False
Options = [poWaitOnExit, poNoConsole]
Priority = ppNormal
StartupOptions = []
ShowWindow = swoNone
WindowColumns = 0
WindowHeight = 0
WindowLeft = 0
WindowRows = 0
WindowTop = 0
WindowWidth = 0
FillAttribute = 0
left = 304
top = 32
end
end



i plik .pas


unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
EditBtn, ExtCtrls, process;

type

{ TForm1 }

TForm1 = class(TForm)
btnGo: TButton;
edtKey: TEdit;
edtInFile: TFileNameEdit;
edtOutFile: TFileNameEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Process1: TProcess;
rgAction: TRadioGroup;
procedure btnGoClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }


procedure TForm1.btnGoClick(Sender: TObject);
var
cmd: string;
begin
case rgAction.ItemIndex of
0: cmd := Format('crypt.exe -encrypt -key %s -infile %s -outfile %s',
[edtKey.Text, UTF8ToSys(edtInFile.Text), UTF8ToSys(edtOutFile.Text)]);
1: cmd := Format('crypt.exe -decrypt -key %s -infile %s -outfile %s',
[edtKey.Text, UTF8ToSys(edtInFile.Text), UTF8ToSys(edtOutFile.Text)]);
end;
Process1.CommandLine := cmd;
Process1.Execute;

end;

end.


I działa bez problemu i nie ma żadnej konsoli. Ale bez żadnych powiadomień.Ten post został edytowany przez Autora dnia 23.10.14 o godzinie 10:38

konto usunięte

Temat: program z linii komend bez okienka DOS-a?

Co do odpalania tego ze skryptu.
Ale po co w ogóle używać plików wsadowych? Przecież sama aplikacja konsolowa (tutaj crypt.exe)

Nie wiem po co. Może ktoś ma skrypt z całą konfiguracją tego i chce mieć to wydzielone, w jednym miejscu? Takie było pytanie, to się do niego odniosłem. Może i rzeczywiście to trochę na około, ale - też mogłoby działać.

Co do przykładu przekodowywania.... Chyba lepiej tego na dysk nie zapisywać.
Jak już ma być bezpiecznie, to niech będzie. Zwłaszcza, że skasowanie pliku, oznacza tylko zmiany w nagłówkach systemu plików, które zwykle są do odkręcenia. Wiem, że to przykład czegoś, co działa, ale z drugiej strony - luka w zabezpieczeniach się robi. Nie, żeby zaraz łatać, ale warto przynajmniej mieć świadomość. :)

konto usunięte

Temat: program z linii komend bez okienka DOS-a?

crypt.bat:


crypt.exe %1 %2 %3 %4 %5 %6 %7 %8 %9



procedure TForm1.btnGoClick(Sender: TObject);
var
cmd: string;
begin
case rgAction.ItemIndex of
0: cmd := Format('crypt.bat -encrypt -key %s -infile %s -outfile %s',
[edtKey.Text, UTF8ToSys(edtInFile.Text), UTF8ToSys(edtOutFile.Text)]);
1: cmd := Format('crypt.bat -decrypt -key %s -infile %s -outfile %s',
[edtKey.Text, UTF8ToSys(edtInFile.Text), UTF8ToSys(edtOutFile.Text)]);
end;
Process1.CommandLine := cmd;
Process1.Execute;

end;



To mi niestety nie działa, natomiast nie było problemu z odpaleniem crypt.exe w ten sposób. Dodam tylko że z poziomu konsoli cmd.exe z tym batem nie ma problemu.

To też nie działa:


procedure TForm1.btnGoClick(Sender: TObject);
var
cmd: string;
begin
case rgAction.ItemIndex of
0: cmd := Format('c:\windows\system32\cmd.exe /c crypt.bat -encrypt -key %s -infile %s -outfile %s',
[edtKey.Text, UTF8ToSys(edtInFile.Text), UTF8ToSys(edtOutFile.Text)]);
1: cmd := Format('c:\windows\system32\cmd.exe /c crypt.bat -decrypt -key %s -infile %s -outfile %s',
[edtKey.Text, UTF8ToSys(edtInFile.Text), UTF8ToSys(edtOutFile.Text)]);
end;
Process1.CommandLine := cmd;
Process1.Execute;

end;

Następna dyskusja:

axis2 bez tomcata




Wyślij zaproszenie do