Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   cmd fenster (https://www.delphipraxis.net/110450-cmd-fenster.html)

technik05 18. Mär 2008 09:09


cmd fenster
 
hallo,

wie kann ich in meinem projekt, ein cmd fenster einbinden, fest einbinden ?
möchte gerne dieses fenster fest im form1 verankern !

beispiel, wird button1 ausgeführt ( eine batchdatei, wird ausgeführt ) geht ja das cmd fenster auf !
dieses möchte ich verhindern und im meinem Form1 ein festes fenster programmieren !

arbeite erst zwei tage mit delphi, wenn möglich ein wenig quelltext anzeigen danke

taaktaak 18. Mär 2008 09:18

Re: cmd fenster
 
Moin, Moin,
schau mal hier, das könnte weiterhelfen

Klaus01 18. Mär 2008 09:24

Re: cmd fenster
 
Guten Morgen,

oder magst Du dir doscmd einmal anschauen.

Grüße
Klaus

Adrian112 18. Mär 2008 09:27

Re: cmd fenster
 
Morgen,
probiers mal so

technik05 18. Mär 2008 09:28

Re: cmd fenster
 
danke klaus,

werde mir das mal anschauen danke

technik05 18. Mär 2008 09:37

Re: cmd fenster
 
ich bin noch zu blöd dafür

so wie mache ich das, möchte das jetzt lernen ! :oops:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

end.
wenn ich button1 drücke, wir eine batchdatei ausgeführt !ich möchte dann , das kein cmd fenster auf geht, sondern im panel angezeigt wir. button1 muß ich noch programmieren, dass bekomme ich hin, habe gestern geübt :lol: :lol:

danke

[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen - Mfg, SirThornberry[/edit]

SirThornberry 18. Mär 2008 09:38

Re: cmd fenster
 
wenn du gerade erst anfängst schau dir mal die Grundlagentutorials an und arbeite dich anschließend durch die anderen durch:
http://www.delphi-treff.de/tutorials/

technik05 18. Mär 2008 09:46

Re: cmd fenster
 
jens du hast ja recht :oops:

werde ich auch noch machen ! steh etwas unter zeit druck ? deswegen meine blöden fragen

dank gruß andre :wink:

taaktaak 18. Mär 2008 09:48

Re: cmd fenster
 
Lernen und Zeitdruck passen leider selten zusammen :(

Die Muhkuh 18. Mär 2008 09:49

Re: cmd fenster
 
Ist das eig. eine Batch-Datei von Dir? Wenn ja, könntest Du die Funktion doch in Delphi nachbilden und den Weg über die CMD vernachlässigen.

technik05 18. Mär 2008 09:52

Re: cmd fenster
 
da ich viel mit batchdateien mache, möchte ich so ein kleines fenster haben
zur kontrolle !

wollte erstmal bei meinen batchdateien bleiben! ist doch ok oder ?

gruß andre

Die Muhkuh 18. Mär 2008 09:55

Re: cmd fenster
 
Klar ist das ok. ;-)

Ich hätte jetzt nur gedacht, dass Du die Funktionen der Batch-Dateien auch in Delphi nachprogrammieren kannst. Überprüfen kannst ja dort genau so gut.

Wenn Dir aber der Weg mit den Batch-Dateien lieber ist, will ich Dich auch nicht davon abhalten.

technik05 18. Mär 2008 10:00

Re: cmd fenster
 
danke,

aber scheint doch nicht so einfach zu sein, so ein blödes fenster zu programmieren oder ?
ich muss noch viel üben :!:

SirThornberry 18. Mär 2008 10:12

Re: cmd fenster
 
hier ist ein beispiel wie das geht:
http://www.delphipraxis.net/viewtopi...=598121#598121

technik05 18. Mär 2008 10:26

Re: cmd fenster
 
was bin ich nervig oder :x :x

was ist das für ein fehler ?? [Fataler Fehler] Unit1.pas(6): Datei nicht gefunden: 'Variants.dcu'

was muß ich hier ändern ??
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
MemoOutput: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BtnWriteCmdClick(Sender: TObject);
procedure EdCmdKeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
private
fInputPipeRead,
fInputPipeWrite,
fOutputPipeRead,
fOutputPipeWrite: Cardinal;
fProcess: Cardinal;
procedure FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal);
procedure FOpenProcess;
procedure FCloseProcess;
procedure FWriteToStdIn(const AText: String);
{ Private declarations }
public
{ Public declarations }
end;

TPipeClbProc = procedure(Sender: TObject; const ABuffer: String; ABufSize: Cardinal) of Object;
TPipeReadThread = class(TThread)
private
fBuffer: String;
fBytesRead: Cardinal;
fClbProc: TPipeClbProc;
fPipeOutput: Cardinal;
procedure FSyncProc;
protected
procedure Execute; override;
constructor Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{================================================= =============================}

constructor TPipeReadThread.Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal);
begin
inherited Create(True);
fClbProc := AClbProc;
fPipeOutput := APipeOutput;
SetLength(fBuffer, 5000);
FreeOnTerminate := True;
Resume;
end;

{================================================= =============================}

procedure TPipeReadThread.Execute;
var LBufSize: Cardinal;
LRes : Boolean;
begin
LBufSize := Length(fBuffer);
repeat
LRes := ReadFile(fPipeOutput, fBuffer[1], LBufSize, fBytesRead, nil);
Synchronize(fSyncProc);
until not(LRes) or Terminated;
end;

{================================================= =============================}

procedure TPipeReadThread.FSyncProc;
begin
fClbProc(Self, fBuffer, fBytesRead);
end;

{================================================= =============================}
{================================================= =============================}
{================================================= =============================}

procedure TForm1.FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal);
var LNew: String;
LPos: Integer;
begin
LNew := copy(ABuffer, 1, ABufSize);
LPos := pos(#$C, LNew);
if (LPos > 0) then
begin
MemoOutput.Text := '';
LNew := copy(LNew, LPos + 1, Length(LNew));
end;
MemoOutput.Text := MemoOutput.Text + LNew;
PostMessage(MemoOutput.Handle, WM_VSCROLL, SB_BOTTOM, 0);
end;

{================================================= =============================}

procedure TForm1.FOpenProcess;
var LStartupInfo: TStartupInfo;
LProcessInfo: TProcessInformation;
LSecurityAttr: TSECURITYATTRIBUTES;
LSecurityDesc: TSecurityDescriptor;
begin
FillChar(LSecurityDesc, SizeOf(LSecurityDesc), 0);
InitializeSecurityDescriptor(@LSecurityDesc, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@LSecurityDesc, True, nil, False);

LSecurityAttr.nLength := SizeOf(LSecurityAttr);
LSecurityAttr.lpSecurityDescriptor := @LSecurityDesc;
LSecurityAttr.bInheritHandle := True;

fProcess := 0;
if CreatePipe(fInputPipeRead, fInputPipeWrite, @LSecurityAttr, 0) then //Input-Pipe
begin
if CreatePipe(fOutputPipeRead, fOutputPipeWrite, @LSecurityAttr, 0) then //Output-Pipe
begin
FillChar(LStartupInfo, SizeOf(LStartupInfo), 0);
FillChar(LProcessInfo, SizeOf(LProcessInfo), 0);
LStartupInfo.cb := SizeOf(LStartupInfo);
LStartupInfo.hStdOutput := fOutputPipeWrite;
LStartupInfo.hStdInput := fInputPipeRead;
LStartupInfo.hStdError := fOutputPipeWrite;
LStartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
LStartupInfo.wShowWindow := SW_HIDE;
if CreateProcess(nil, 'cmd', @LSecurityAttr, nil, True, 0, nil, nil, LStartupInfo, LProcessInfo) then
begin
fProcess := LProcessInfo.hProcess;
TPipeReadThread.Create(FClbProc, fOutputPipeRead);
end else begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
CloseHandle(fOutputPipeRead);
CloseHandle(fOutputPipeWrite);
end;
end else begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
end;
end
end;

{================================================= =============================}

procedure TForm1.FCloseProcess;
begin
if (fProcess <> 0) then
begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
CloseHandle(fOutputPipeRead);
CloseHandle(fOutputPipeWrite);
TerminateProcess(fProcess, 0);
fProcess := 0;
end;
end;

{================================================= =============================}

procedure TForm1.FWriteToStdIn(const AText: String);
var LPos,
LWritten: Cardinal;
LRes : Boolean;
begin
LPos := 1;
repeat
LWritten := 0;
LRes := WriteFile(fInputPipeWrite, AText[LPos], Cardinal(Length(AText)) - LPos + 1, LWritten, nil);
inc(LPos, LWritten);
until not(LRes) or (LPos > Cardinal(Length(AText)));
end;

{================================================= =============================}

procedure TForm1.FormCreate(Sender: TObject);
begin
fProcess := 0;
FOpenProcess;
end;

{================================================= =============================}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FCloseProcess;
end;

{================================================= =============================}

procedure TForm1.BtnWriteCmdClick(Sender: TObject);
begin
FWriteToStdIn(EdCmd.Text + #13#10);
EdCmd.Text := '';
end;

{================================================= =============================}

procedure TForm1.EdCmdKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
Key := #0;
BtnWriteCmdClick(nil);
end;
end;

{================================================= =============================}

procedure TForm1.Button1Click(Sender: TObject);
procedure TForm1.Button1Click(Sender: TObject);
VAR e: INTEGER;

begin

e := ShellExecute

(Handle,

NIL,

PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Handyalarm\NEF .BAT'),

PCHAR(''),

NIL,

SW_SHOW);

IF (e<=32) THEN

begin

ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!')

end;

end.

DeddyH 18. Mär 2008 10:32

Re: cmd fenster
 
Du hast anscheinend noch ein Delphi < 7 (oder war das 6?). Lösch einfach die Unit "Variants" aus der uses-Klausel heraus.

technik05 18. Mär 2008 10:38

Re: cmd fenster
 
habe ich gemacht, jetzt habe ich die probleme:

[Fehler] Unit1.pas(199): Undefinierter Bezeichner: 'EdCmd'
[Fehler] Unit1.pas(199): Anweisung erforderlich, aber Ausdruck vom Typ 'TCaption' gefunden
[Fehler] Unit1.pas(217): ';' erwartet, aber '.' gefunden
[Fehler] Unit1.pas(222): Undefinierter Bezeichner: 'ShellExecute'
[Fehler] Unit1.pas(244): ';' erwartet, aber '.' gefunden
[Fehler] Unit1.pas(246): Deklaration erwartet, aber Dateiende gefunden
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

arbeite mit delphi 5

technik05 18. Mär 2008 10:40

Re: cmd fenster
 
der fehler:

Fehler] Unit1.pas(222): Undefinierter Bezeichner: 'ShellExecute

habe ich gerade selber behoben

Fussball-Robby 18. Mär 2008 10:41

Re: cmd fenster
 
Ich habe auch Delphi 5 und musste nur Variants aus der uses-Klausel löschen, damit es ging. Sicher, dass du nichts anderes geändert hast?

Mfg

technik05 18. Mär 2008 10:45

Re: cmd fenster
 
es geht danke :)

technik05 18. Mär 2008 10:50

Re: cmd fenster
 
scheiße :oops: :oops:

wenn meine batchdatei ausgeführt wird geht immer noch das cmd fenster auf

hier schaut mal rein:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ShellAPI;

type
TForm1 = class(TForm)
MemoOutput: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
fInputPipeRead,
fInputPipeWrite,
fOutputPipeRead,
fOutputPipeWrite: Cardinal;
fProcess: Cardinal;
procedure FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal);
procedure FOpenProcess;
procedure FCloseProcess;
procedure FWriteToStdIn(const AText: String);
{ Private declarations }
public
{ Public declarations }
end;

TPipeClbProc = procedure(Sender: TObject; const ABuffer: String; ABufSize: Cardinal) of Object;
TPipeReadThread = class(TThread)
private
fBuffer: String;
fBytesRead: Cardinal;
fClbProc: TPipeClbProc;
fPipeOutput: Cardinal;
procedure FSyncProc;
protected
procedure Execute; override;
constructor Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{================================================= =============================}

constructor TPipeReadThread.Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal);
begin
inherited Create(True);
fClbProc := AClbProc;
fPipeOutput := APipeOutput;
SetLength(fBuffer, 5000);
FreeOnTerminate := True;
Resume;
end;

{================================================= =============================}

procedure TPipeReadThread.Execute;
var LBufSize: Cardinal;
LRes : Boolean;
begin
LBufSize := Length(fBuffer);
repeat
LRes := ReadFile(fPipeOutput, fBuffer[1], LBufSize, fBytesRead, nil);
Synchronize(fSyncProc);
until not(LRes) or Terminated;
end;

{================================================= =============================}

procedure TPipeReadThread.FSyncProc;
begin
fClbProc(Self, fBuffer, fBytesRead);
end;

{================================================= =============================}
{================================================= =============================}
{================================================= =============================}

procedure TForm1.FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal);
var LNew: String;
LPos: Integer;
begin
LNew := copy(ABuffer, 1, ABufSize);
LPos := pos(#$C, LNew);
if (LPos > 0) then
begin
MemoOutput.Text := '';
LNew := copy(LNew, LPos + 1, Length(LNew));
end;
MemoOutput.Text := MemoOutput.Text + LNew;
PostMessage(MemoOutput.Handle, WM_VSCROLL, SB_BOTTOM, 0);
end;

{================================================= =============================}

procedure TForm1.FOpenProcess;
var LStartupInfo: TStartupInfo;
LProcessInfo: TProcessInformation;
LSecurityAttr: TSECURITYATTRIBUTES;
LSecurityDesc: TSecurityDescriptor;
begin
FillChar(LSecurityDesc, SizeOf(LSecurityDesc), 0);
InitializeSecurityDescriptor(@LSecurityDesc, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@LSecurityDesc, True, nil, False);

LSecurityAttr.nLength := SizeOf(LSecurityAttr);
LSecurityAttr.lpSecurityDescriptor := @LSecurityDesc;
LSecurityAttr.bInheritHandle := True;

fProcess := 0;
if CreatePipe(fInputPipeRead, fInputPipeWrite, @LSecurityAttr, 0) then //Input-Pipe
begin
if CreatePipe(fOutputPipeRead, fOutputPipeWrite, @LSecurityAttr, 0) then //Output-Pipe
begin
FillChar(LStartupInfo, SizeOf(LStartupInfo), 0);
FillChar(LProcessInfo, SizeOf(LProcessInfo), 0);
LStartupInfo.cb := SizeOf(LStartupInfo);
LStartupInfo.hStdOutput := fOutputPipeWrite;
LStartupInfo.hStdInput := fInputPipeRead;
LStartupInfo.hStdError := fOutputPipeWrite;
LStartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
LStartupInfo.wShowWindow := SW_HIDE;
if CreateProcess(nil, 'cmd', @LSecurityAttr, nil, True, 0, nil, nil, LStartupInfo, LProcessInfo) then
begin
fProcess := LProcessInfo.hProcess;
TPipeReadThread.Create(FClbProc, fOutputPipeRead);
end else begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
CloseHandle(fOutputPipeRead);
CloseHandle(fOutputPipeWrite);
end;
end else begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
end;
end
end;

{================================================= =============================}

procedure TForm1.FCloseProcess;
begin
if (fProcess <> 0) then
begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
CloseHandle(fOutputPipeRead);
CloseHandle(fOutputPipeWrite);
TerminateProcess(fProcess, 0);
fProcess := 0;
end;
end;

{================================================= =============================}

procedure TForm1.FWriteToStdIn(const AText: String);
var LPos,
LWritten: Cardinal;
LRes : Boolean;
begin
LPos := 1;
repeat
LWritten := 0;
LRes := WriteFile(fInputPipeWrite, AText[LPos], Cardinal(Length(AText)) - LPos + 1, LWritten, nil);
inc(LPos, LWritten);
until not(LRes) or (LPos > Cardinal(Length(AText)));
end;

{================================================= =============================}

procedure TForm1.FormCreate(Sender: TObject);
begin
fProcess := 0;
FOpenProcess;
end;

{================================================= =============================}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FCloseProcess;
end;

{================================================= =============================}




{================================================= =============================}

procedure TForm1.Button1Click(Sender: TObject);
VAR e: INTEGER;
begin

e := ShellExecute

(Handle,

NIL,

PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ),

PCHAR(''),

NIL,

SW_SHOW);

IF (e<=32) THEN

begin

ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!')

end

end;

end.



batchdatei zum test ping localhost probiert mal

technik05 18. Mär 2008 11:20

Re: cmd fenster
 
wer kann mir weiter helfen ?

kann auch das ganze programm schicken !!

Die Muhkuh 18. Mär 2008 11:26

Re: cmd fenster
 
Hi,

Du brauchst nicht innerhalb 30 Minuten zu pushen, dazu keine Delphi-Tags um den Code.

hoika 18. Mär 2008 11:37

Re: cmd fenster
 
Hallo,

lass das mit dem ShellExecute weg
und folge dem Beispiel.

http://www.delphi-treff.de/tipps/system/tipp/524/


Heiko

SirThornberry 18. Mär 2008 11:54

Re: cmd fenster
 
als erstes die Delphi-Tags nachträglich setzen (den Beitrag kannst du mit dem Edit-button nachträglich bearbeiten) und als nächstes uns deine Delphiversion verraten.

technik05 18. Mär 2008 11:57

Re: cmd fenster
 
was heißt delphi tags ??? ich bin doch ganz neu dabei

versuche seit zwei tagen mit delphi 5 zu arbeiten

Die Muhkuh 18. Mär 2008 11:58

Re: cmd fenster
 
Delphi-Quellcode:
<Hier Code hin>
< Das sind die Delphi-Tags. Wenn Du die um Deinen Code machst, wird der farblich korrekt dargestellt.

hoika 18. Mär 2008 13:20

Re: cmd fenster
 
Hallo,

mit Tags ist das Forum hier gemeint, nicht Delphi selber.
Markier den Delphi-Code im Edit-Fenster und klciek oben auf Delphi-Code.

Ah ja und willkommen bei Delphi ;)


Heiko

technik05 18. Mär 2008 14:07

Re: cmd fenster bekomme es einfach nicht hin
 
hallo bekomme es einfach nicht hin:

wenn button 1 eine bachdatei ausführt soll sie in meiner console angezeigt werden und nicht wo anders
was mache ich falsch :wall: :wall: schaut euch den quelltext an und ändert in bitte danke

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellAPI;

type
TForm1 = class(TForm)
MemoOutput: TMemo;
EdCmd: TEdit;
BtnWriteCmd: TButton;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BtnWriteCmdClick(Sender: TObject);
procedure EdCmdKeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
private
fInputPipeRead,
fInputPipeWrite,
fOutputPipeRead,
fOutputPipeWrite: Cardinal;
fProcess: Cardinal;
procedure FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal);
procedure FOpenProcess;
procedure FCloseProcess;
procedure FWriteToStdIn(const AText: String);
{ Private declarations }
public
{ Public declarations }
end;

TPipeClbProc = procedure(Sender: TObject; const ABuffer: String; ABufSize: Cardinal) of Object;
TPipeReadThread = class(TThread)
private
fBuffer: String;
fBytesRead: Cardinal;
fClbProc: TPipeClbProc;
fPipeOutput: Cardinal;
procedure FSyncProc;
protected
procedure Execute; override;
constructor Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

constructor TPipeReadThread.Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal);
begin
inherited Create(True);
fClbProc := AClbProc;
fPipeOutput := APipeOutput;
SetLength(fBuffer, 5000);
FreeOnTerminate := True;
Resume;
end;

procedure TPipeReadThread.Execute;
var LBufSize: Cardinal;
LRes : Boolean;
begin
LBufSize := Length(fBuffer);
repeat
LRes := ReadFile(fPipeOutput, fBuffer[1], LBufSize, fBytesRead, nil);
Synchronize(fSyncProc);
until not(LRes) or Terminated;
end;

procedure TPipeReadThread.FSyncProc;
begin
fClbProc(Self, fBuffer, fBytesRead);
end;

procedure TForm1.FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal);
var LNew: String;
LPos: Integer;
begin
LNew := copy(ABuffer, 1, ABufSize);
LPos := pos(#$C, LNew);
if (LPos > 0) then
begin
MemoOutput.Text := '';
LNew := copy(LNew, LPos + 1, Length(LNew));
end;
MemoOutput.Text := MemoOutput.Text + LNew;
PostMessage(MemoOutput.Handle, WM_VSCROLL, SB_BOTTOM, 0);
end;

procedure TForm1.FOpenProcess;
var LStartupInfo: TStartupInfo;
LProcessInfo: TProcessInformation;
LSecurityAttr: TSECURITYATTRIBUTES;
LSecurityDesc: TSecurityDescriptor;
begin
FillChar(LSecurityDesc, SizeOf(LSecurityDesc), 0);
InitializeSecurityDescriptor(@LSecurityDesc, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@LSecurityDesc, True, nil, False);

LSecurityAttr.nLength := SizeOf(LSecurityAttr);
LSecurityAttr.lpSecurityDescriptor := @LSecurityDesc;
LSecurityAttr.bInheritHandle := True;

fProcess := 0;
if CreatePipe(fInputPipeRead, fInputPipeWrite, @LSecurityAttr, 0) then //Input-Pipe
begin
if CreatePipe(fOutputPipeRead, fOutputPipeWrite, @LSecurityAttr, 0) then //Output-Pipe
begin
FillChar(LStartupInfo, SizeOf(LStartupInfo), 0);
FillChar(LProcessInfo, SizeOf(LProcessInfo), 0);
LStartupInfo.cb := SizeOf(LStartupInfo);
LStartupInfo.hStdOutput := fOutputPipeWrite;
LStartupInfo.hStdInput := fInputPipeRead;
LStartupInfo.hStdError := fOutputPipeWrite;
LStartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
LStartupInfo.wShowWindow := SW_HIDE;
if CreateProcess(nil, 'cmd', @LSecurityAttr, nil, True, 0, nil, nil, LStartupInfo, LProcessInfo) then
begin
fProcess := LProcessInfo.hProcess;
TPipeReadThread.Create(FClbProc, fOutputPipeRead);
end else begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
CloseHandle(fOutputPipeRead);
CloseHandle(fOutputPipeWrite);
end;
end else begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
end;
end
end;

procedure TForm1.FCloseProcess;
begin
if (fProcess <> 0) then
begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
CloseHandle(fOutputPipeRead);
CloseHandle(fOutputPipeWrite);
TerminateProcess(fProcess, 0);
fProcess := 0;
end;
end;

procedure TForm1.FWriteToStdIn(const AText: String);
var LPos,
LWritten: Cardinal;
LRes : Boolean;
begin
LPos := 1;
repeat
LWritten := 0;
LRes := WriteFile(fInputPipeWrite, AText[LPos], Cardinal(Length(AText)) - LPos + 1, LWritten, nil);
inc(LPos, LWritten);
until not(LRes) or (LPos > Cardinal(Length(AText)));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
fProcess := 0;
FOpenProcess;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FCloseProcess;
end;

procedure TForm1.BtnWriteCmdClick(Sender: TObject);
begin
FWriteToStdIn(EdCmd.Text + #13#10);
EdCmd.Text := '';
end;

procedure TForm1.EdCmdKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
Key := #0;
BtnWriteCmdClick(nil);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
VAR e: INTEGER;

begin

e := ShellExecute

(Handle,

NIL,

PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\testus\NEF.BAT '),

PCHAR(''),

NIL,

SW_SHOW);

IF (e<=32) THEN

begin

ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!')


end

end;
end.

[code]

taaktaak 18. Mär 2008 14:11

Re: cmd fenster
 
Moin, Moin technik05!

In Beitrag #24 wurde doch schon gesagt, vergiss das ShellExecute und verwende das Beispiel aus dsdt. Ich habe das heute auch mal verwendet, das funktioniert!

technik05 18. Mär 2008 14:24

Re: cmd fenster
 
aber bei funktoniert es nicht !!!

Die Muhkuh 18. Mär 2008 14:25

Re: cmd fenster
 
Und was funktioniert nicht?

Du schreibst immer nur, geht nicht, wir sollen es ausbaden und Du setzt nicht mal die Delphi-Tags korrekt um Deinen Code...

taaktaak 18. Mär 2008 14:26

Re: cmd fenster
 
... dann ein gut gemeinter Rat:

Vergiss doch für ein paar Minuten dein eigentliches Programm und beschäftige dich ausschließlich mit der Umsetzung des dsdt-Beispiels: Kopiere die Funktion "GetConsoleOutput" in ein neues Projekt, packe auf das Form einen Button und ein Memo. In das OnClick des Buttons fügst du folgenden Code ein. Der ist gegenüber dem dsdt-Beispiel etwas erweitert, damit z.B. auch Umlaute im Memo korrekt dargestellt werden:

Delphi-Quellcode:
procedure T~~.Button1Click(Sender:TObject);
var  Output,
      Errors         : TStringList;
      CmdInterpreter,
      Command        : String;

  function IsWindowsNT:Boolean;
  begin
    Result:=(Win32Platform=Ver_Platform_Win32_NT);
  end;

  function ConsoleStr2AnsiStr(ConsoleStr:String):String;
  var Buffer : pChar;
  begin
    Result:=ConsoleStr;
    GetMem(Buffer,length(ConsoleStr)+1);
    try
      OEMToCharBuff(pChar(ConsoleStr),Buffer,length(ConsoleStr));
      SetString   (Result,Buffer,length(ConsoleStr));
    finally
      FreeMem(Buffer,length(ConsoleStr)+1);
      end;
  end;

begin
  Memo1.Clear;

  Command:='dir c:\'; // <<< hier DEINEN BatchAufruf placieren!!!!!!

  if IsWindowsNT then CmdInterpreter:='cmd'
                 else CmdInterpreter:='command';

  Output:=TStringList.Create;

  try
    Errors:=TStringList.Create;
    if GetConsoleOutput(CmdInterpreter+' /c '+Command,Output,Errors) then begin
      Memo1.Lines.AddStrings(Output);
      Memo1.Text:=ConsoleStr2AnsiStr(Memo1.Text);
      end

  finally
    Output.Free;
    Errors.Free;
    end;

end;
Und wenn hier alles funktioniert, übernimmst du das Ganze in dein eigentliches Projekt!
:hi: Viel Erfolg!

technik05 18. Mär 2008 14:30

Re: cmd fenster
 
[delphi][code][dp][center]

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ShellAPI, ExtCtrls;

type
TForm1 = class(TForm)
MemoOutput: TMemo;
Button1: TButton;
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Panel2: TPanel;
Panel3: TPanel;
Label4: TLabel;
Label5: TLabel;
Panel4: TPanel;
Label6: TLabel;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Label7: TLabel;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
fInputPipeRead,
fInputPipeWrite,
fOutputPipeRead,
fOutputPipeWrite: Cardinal;
fProcess: Cardinal;
procedure FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal);
procedure FOpenProcess;
procedure FCloseProcess;
{ Private declarations }
public
{ Public declarations }
end;

TPipeClbProc = procedure(Sender: TObject; const ABuffer: String; ABufSize: Cardinal) of Object;
TPipeReadThread = class(TThread)
private
fBuffer: String;
fBytesRead: Cardinal;
fClbProc: TPipeClbProc;
fPipeOutput: Cardinal;
procedure FSyncProc;
protected
procedure Execute; override;
constructor Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{================================================= =============================}

constructor TPipeReadThread.Create(AClbProc: TPipeClbProc; APipeOutput: Cardinal);
begin
inherited Create(True);
fClbProc := AClbProc;
fPipeOutput := APipeOutput;
SetLength(fBuffer, 5000);
FreeOnTerminate := True;
Resume;
end;

{================================================= =============================}

procedure TPipeReadThread.Execute;
var LBufSize: Cardinal;
LRes : Boolean;
begin
LBufSize := Length(fBuffer);
repeat
LRes := ReadFile(fPipeOutput, fBuffer[1], LBufSize, fBytesRead, nil);
Synchronize(fSyncProc);
until not(LRes) or Terminated;
end;

{================================================= =============================}

procedure TPipeReadThread.FSyncProc;
begin
fClbProc(Self, fBuffer, fBytesRead);
end;

{================================================= =============================}
{================================================= =============================}
{================================================= =============================}

procedure TForm1.FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal);
var LNew: String;
LPos: Integer;
begin
LNew := copy(ABuffer, 1, ABufSize);
LPos := pos(#$C, LNew);
if (LPos > 0) then
begin
MemoOutput.Text := '';
LNew := copy(LNew, LPos + 1, Length(LNew));
end;
MemoOutput.Text := MemoOutput.Text + LNew;
PostMessage(MemoOutput.Handle, WM_VSCROLL, SB_BOTTOM, 0);
end;

{================================================= =============================}

procedure TForm1.FOpenProcess;
var LStartupInfo: TStartupInfo;
LProcessInfo: TProcessInformation;
LSecurityAttr: TSECURITYATTRIBUTES;
LSecurityDesc: TSecurityDescriptor;
begin
FillChar(LSecurityDesc, SizeOf(LSecurityDesc), 0);
InitializeSecurityDescriptor(@LSecurityDesc, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@LSecurityDesc, True, nil, False);

LSecurityAttr.nLength := SizeOf(LSecurityAttr);
LSecurityAttr.lpSecurityDescriptor := @LSecurityDesc;
LSecurityAttr.bInheritHandle := True;

fProcess := 0;
if CreatePipe(fInputPipeRead, fInputPipeWrite, @LSecurityAttr, 0) then //Input-Pipe
begin
if CreatePipe(fOutputPipeRead, fOutputPipeWrite, @LSecurityAttr, 0) then //Output-Pipe
begin
FillChar(LStartupInfo, SizeOf(LStartupInfo), 0);
FillChar(LProcessInfo, SizeOf(LProcessInfo), 0);
LStartupInfo.cb := SizeOf(LStartupInfo);
LStartupInfo.hStdOutput := fOutputPipeWrite;
LStartupInfo.hStdInput := fInputPipeRead;
LStartupInfo.hStdError := fOutputPipeWrite;
LStartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
LStartupInfo.wShowWindow := SW_HIDE;
if CreateProcess(nil, 'cmd', @LSecurityAttr, nil, True, 0, nil, nil, LStartupInfo, LProcessInfo) then
begin
fProcess := LProcessInfo.hProcess;
TPipeReadThread.Create(FClbProc, fOutputPipeRead);
end else begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
CloseHandle(fOutputPipeRead);
CloseHandle(fOutputPipeWrite);
end;
end else begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
end;
end
end;

{================================================= =============================}

procedure TForm1.FCloseProcess;
begin
if (fProcess <> 0) then
begin
CloseHandle(fInputPipeRead);
CloseHandle(fInputPipeWrite);
CloseHandle(fOutputPipeRead);
CloseHandle(fOutputPipeWrite);
TerminateProcess(fProcess, 0);
fProcess := 0;
end;
end;

{================================================= =============================}



{================================================= =============================}

procedure TForm1.FormCreate(Sender: TObject);
begin
fProcess := 0;
FOpenProcess;
end;

{================================================= =============================}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FCloseProcess;
end;

{================================================= =============================}




{================================================= =============================}

procedure TForm1.Button1Click(Sender: TObject);
VAR e: INTEGER;
begin

e := ShellExecute

(Handle,

NIL,

PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ),

PCHAR(''),

NIL,

SW_SHOW);

IF (e<=32) THEN

begin

ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!')

end

end;

procedure TForm1.Button2Click(Sender: TObject);
VAR e: INTEGER;
begin

e := ShellExecute

(Handle,

NIL,

PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ),

PCHAR(''),

NIL,

SW_SHOW);

IF (e<=32) THEN

begin

ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!')

end

end;

procedure TForm1.Button3Click(Sender: TObject);
VAR e: INTEGER;
begin

e := ShellExecute

(Handle,

NIL,

PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ),

PCHAR(''),

NIL,

SW_SHOW);

IF (e<=32) THEN

begin

ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!')

end

end;

procedure TForm1.Button4Click(Sender: TObject);
VAR e: INTEGER;
begin

e := ShellExecute

(Handle,

NIL,

PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ),

PCHAR(''),

NIL,

SW_SHOW);

IF (e<=32) THEN

begin

ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!')

end

end;

procedure TForm1.Button5Click(Sender: TObject);
VAR e: INTEGER;
begin

e := ShellExecute

(Handle,

NIL,

PCHAR('C:\Dokumente und Einstellungen\Administrator\Desktop\Alarm\NEF.BAT' ),

PCHAR(''),

NIL,

SW_SHOW);

IF (e<=32) THEN

begin

ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!')

end

end;

end.



so richtig zeig mir mal ein beispiel bitte

taaktaak 18. Mär 2008 14:36

Re: cmd fenster
 
Liste der Anhänge anzeigen (Anzahl: 1)
Grrr........
(hier ein Beispiel)

hoika 18. Mär 2008 14:38

Re: cmd fenster
 
Hallo,

und formatier bitte endlich den Code!
Ich bekomme Augenkrebs ...


Heiko

Fussball-Robby 18. Mär 2008 14:47

Re: cmd fenster
 
Zitat:

Zitat von hoika
und formatier bitte endlich den Code!
Ich bekomme Augenkrebs ...

Ich auch :shock: Und ich glaube auch nicht, dass es weiterhilft, wenn du die gesamte Unit 4 mal postest :roll:

Mfg

technik05 18. Mär 2008 14:50

Re: cmd fenster
 
so habe ich es gemacht ! bestimmt alles falsch oder :oops:

[delphi]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Memo1Change(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}


function GetConsoleOutput(const Command: String; var Output, Errors: TStringList): Boolean;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
SecurityAttr: TSecurityAttributes;
PipeOutputRead: THandle;
PipeOutputWrite: THandle;
PipeErrorsRead: THandle;
PipeErrorsWrite: THandle;
Succeed: Boolean;
Buffer: array [0..255] of Char;
NumberOfBytesRead: DWORD;
Stream: TMemoryStream;
begin
//Initialisierung ProcessInfo
FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);

//Initialisierung SecurityAttr
FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
SecurityAttr.nLength := SizeOf(SecurityAttr);
SecurityAttr.bInheritHandle := true;
SecurityAttr.lpSecurityDescriptor := nil;

//Pipes erzeugen
CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);

//Initialisierung StartupInfo
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.hStdInput := 0;
StartupInfo.hStdOutput := PipeOutputWrite;
StartupInfo.hStdError := PipeErrorsWrite;
StartupInfo.wShowWindow := sw_Hide;
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

if CreateProcess(nil, PChar(command), nil, nil, true,
CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
StartupInfo, ProcessInfo) then begin
result:=true;
//Write-Pipes schließen
CloseHandle(PipeOutputWrite);
CloseHandle(PipeErrorsWrite);

//Ausgabe Read-Pipe auslesen
Stream := TMemoryStream.Create;
try
while true do begin
succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
if not succeed then break;
Stream.Write(Buffer, NumberOfBytesRead);
end;
Stream.Position := 0;
Output.LoadFromStream(Stream);
finally
Stream.Free;
end;
CloseHandle(PipeOutputRead);

//Fehler Read-Pipe auslesen
Stream := TMemoryStream.Create;
try
while true do begin
succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil);
if not succeed then break;
Stream.Write(Buffer, NumberOfBytesRead);
end;
Stream.Position := 0;
Errors.LoadFromStream(Stream);
finally
Stream.Free;
end;
CloseHandle(PipeErrorsRead);

WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hProcess);
end
else begin
result:=false;
CloseHandle(PipeOutputRead);
CloseHandle(PipeOutputWrite);
CloseHandle(PipeErrorsRead);
CloseHandle(PipeErrorsWrite);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
var Output,
Errors : TStringList;
CmdInterpreter,
Command : String;

function IsWindowsNT:Boolean;
begin
Result:=(Win32Platform=Ver_Platform_Win32_NT);
end;

function ConsoleStr2AnsiStr(ConsoleStr:String):String;
var Buffer : pChar;
begin
Result:=ConsoleStr;
GetMem(Buffer,length(ConsoleStr)+1);
try
OEMToCharBuff(pChar(ConsoleStr),Buffer,length(Cons oleStr));
SetString (Result,Buffer,length(ConsoleStr));
finally
FreeMem(Buffer,length(ConsoleStr)+1);
end;

procedure TForm1.Memo1Change(Sender: TObject);
begin
Memo1.Clear;

Command:='dir c:\'; // <<< hier DEINEN BatchAufruf placieren!!!!!!

if IsWindowsNT then CmdInterpreter:='cmd'
else CmdInterpreter:='command';

Output:=TStringList.Create;

try
Errors:=TStringList.Create;
if GetConsoleOutput(CmdInterpreter+' /c '+Command,Output,Errors) then begin
Memo1.Lines.AddStrings(Output);
Memo1.Text:=ConsoleStr2AnsiStr(Memo1.Text);
end

finally
Output.Free;
Errors.Free;
end;

end.

:wall:[pre][/pre][pre]
Code:
[dp][size=8][center][/size][size=24][cl][/dp]
[/pre]

technik05 18. Mär 2008 14:51

Re: cmd fenster
 
ich bekomme gleich auch augenkrebs was mache ich falsch

DeddyH 18. Mär 2008 14:52

Re: cmd fenster
 
Du musst den Tag mit
Delphi-Quellcode:
 öffnen und mit
schließen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz