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/)
-   -   Delphi Delphi Programm, im hintegrund cmd-befehle (https://www.delphipraxis.net/104605-delphi-programm-im-hintegrund-cmd-befehle.html)

Eppos 7. Dez 2007 12:47


Delphi Programm, im hintegrund cmd-befehle
 
Hallo zusammen,

ich möchte ein Delphi Programm schreiben, in dem ich über die Command-Box (cmd.exe) von Windows Befehle schicke.
Wie z.B. Dienste beenden und starten.

Kann mir jemand ein kleines Beispiel schicken, mit welchem Befehl in Delphi ich das machen kann.

Die Commando-Box darf aber nicht sichtbar sein...

Vielen Dank!

TeronG 7. Dez 2007 12:59

Re: Delphi Programm, im hintegrund cmd-befehle
 
Such mal nach ... ShellExecute()
:gruebel: Is doch net schlimm, wenn der Anwender ne "black box" sieht oder?

Eppos 7. Dez 2007 13:04

Re: Delphi Programm, im hintegrund cmd-befehle
 
also, beime nächstenmal benutze ich zu erst die suchfunktion. :-)

Doch ist schlimm, er darf nicht wissen was passiert :-)

Ich habe mir jetzt mal die TDosCommand Kompo angeschaut... mal schauen ob es damit klappt

Danke!

dominikkv 7. Dez 2007 13:06

Re: Delphi Programm, im hintegrund cmd-befehle
 
Zitat:

Zitat von Eppos
Doch ist schlimm, er darf nicht wissen was passiert :-)

ó_Ò

Da drängt sich jetzt direkt die Frage auf was das für ein Programm ist ?!?

sirius 7. Dez 2007 13:06

Re: Delphi Programm, im hintegrund cmd-befehle
 
http://www.dsdt.info/tipps/?id=637&search=createpipe
:warn: Lass den Nutzer immer wissen, was das Programm macht!

Eppos 7. Dez 2007 13:14

Re: Delphi Programm, im hintegrund cmd-befehle
 
also, ich habe ein script geschrieben, dass ich mit delphi eigenlich nur schützen möchte, dass heisst, Das Script kann nicht einfach mehrmals kopiert werden?!

Hat jemand ne Idee bzgl. der dos-Box wo man nicht sehen kann?

DeddyH 7. Dez 2007 13:31

Re: Delphi Programm, im hintegrund cmd-befehle
 
Wenn Du ShellExecute schon gefunden hast, schau Dir mal den letzten Parameter genau an ;)

Eppos 7. Dez 2007 13:52

Re: Delphi Programm, im hintegrund cmd-befehle
 
also ich ahbe jetzt vieles ausprobiert, aber ich komme auf keinen grünen Zweig.

Ich habe immer einen ganz einfachen Befehl ausführern wollen "del C:\test.exe"
Er macht es einfach nicht.

ich habe folgende ausprobiert:
http://www.dsdt.info/tipps/?id=637&search=createpipe
http://www.delphipraxis.net/internal...ct.php?t=37850
und bei ShellExecute, weiss ich nicht, wo da noch platz für den Befehl sein soll. Als Parameter?

sirius 7. Dez 2007 13:54

Re: Delphi Programm, im hintegrund cmd-befehle
 
test.exe ist nicht zufällig dein Programm?

Eppos 7. Dez 2007 14:04

Re: Delphi Programm, im hintegrund cmd-befehle
 
:lol: NEIN

mkinzler 7. Dez 2007 14:19

Re: Delphi Programm, im hintegrund cmd-befehle
 
Zitat:

und bei ShellExecute, weiss ich nicht, wo da noch platz für den Befehl sein soll. Als Parameter?
oder als Teil des Befehls

Eppos 7. Dez 2007 14:32

Re: Delphi Programm, im hintegrund cmd-befehle
 
also ich habe folgendes gemacht:
Delphi-Quellcode:
   ShellExecute(0, Nil, PChar('cmd'), Pchar('del C:\test.exe'), Pchar(''), SW_NORMAL);
aber so funktioniert das nicht?!

Hat jemand vielelicht ne idee, wie es richtet geht?!

Danke!

DeddyH 7. Dez 2007 14:34

Re: Delphi Programm, im hintegrund cmd-befehle
 
Mach mal aus dem 2. Parameter ein 'open'.

[edit] Achja, ein /c muss auch noch in die Parameter.
Delphi-Quellcode:
  ShellExecute(Handle,'open','cmd','/c dir c:\windows',nil,SW_SHOWDEFAULT);
[/edit]

Eppos 7. Dez 2007 16:24

Re: Delphi Programm, im hintegrund cmd-befehle
 
hat geklappt, Danke!

Aber, wie kann ich den Fehler, der z.B. beim Löschen auftritt aus der Dos-Box auslesen?

mkinzler 7. Dez 2007 16:26

Re: Delphi Programm, im hintegrund cmd-befehle
 
-Lenke das Ergebnis in eine Textdatei um und parse diese
-oder verwende CreateProcess()

Eppos 7. Dez 2007 16:34

Re: Delphi Programm, im hintegrund cmd-befehle
 
habe ich gemacht, aber es kommt eine fehelrmeldung, "hinst and string"
was ist HInst und wie kann ich den zum String befördern?

mkinzler 7. Dez 2007 16:35

Re: Delphi Programm, im hintegrund cmd-befehle
 
Was hast du gemacht?

Eppos 7. Dez 2007 16:37

Re: Delphi Programm, im hintegrund cmd-befehle
 
Delphi-Quellcode:
  Memo1.Lines.AddStrings( ShellExecute(Handle,'open','cmd','/c del C:\test.exe',nil, SW_HIDE) );
Gibt es auch die möglichkeit, wenn es geklappt, dass ich dann Ture bzw. False zurückbekomme?!

mkinzler 7. Dez 2007 16:42

Re: Delphi Programm, im hintegrund cmd-befehle
 
Schau dir mal die Rückgabewerte von ShellExecute() an.

Eppos 7. Dez 2007 17:06

Re: Delphi Programm, im hintegrund cmd-befehle
 
ok, bekomme aber als Fehlercode 42 raus?!

DeddyH 7. Dez 2007 17:07

Re: Delphi Programm, im hintegrund cmd-befehle
 
Hast Du richtig nachgelesen?

Eppos 7. Dez 2007 17:11

Re: Delphi Programm, im hintegrund cmd-befehle
 
ich bekomme als Fehler, wenn ich den Befehl einfach die command-Box ausgebe: "Die Datei konnte nicht ausgeführ werden".
also ich habe nichts mit Fehlercode 42 finden können?!

DeddyH 7. Dez 2007 17:16

Re: Delphi Programm, im hintegrund cmd-befehle
 
Zitat:

Zitat von Eppos
ich bekomme als Fehler, wenn ich den Befehl einfach die command-Box ausgebe: "Die Datei konnte nicht ausgeführ werden".

Sry, das hab ich inhaltlich nicht verstanden. :gruebel:

Eppos 7. Dez 2007 17:19

Re: Delphi Programm, im hintegrund cmd-befehle
 
Also ich führe über ShellExecute folgende Befehl aus:

Delphi-Quellcode:
  ShellExecute(Handle,'open','cmd','/c del C:\test.exe',nil, SW_HIDE);
Diese Datei (test.exe) existiert aber nicht, absichtlich.
Es kommt also zu einem Fehler. Der Rückgabewert der Funktion ist "42".

Wenn ich den gleichen Befehl direkt (ohne Delphi, sondern über Windows) in die "CMD" eingebe,
gibt er mir diesen Fehler:
C:\test.exe konnte nicht gefunden werden

DeddyH 7. Dez 2007 17:22

Re: Delphi Programm, im hintegrund cmd-befehle
 
Wenn der Rückgabewert von ShellExecute > 32 ist, hat die Ausführung an sich funktioniert, sofern ich die Hilfe richtig lesen kann.

Eppos 7. Dez 2007 17:25

Re: Delphi Programm, im hintegrund cmd-befehle
 
ja das habe ich auch so gelesen, ist aber anscheinend nicht der Fall.

Was mich auch stört, das Delphi den Befehl schickt, aber nicht wartet bis der Befehl fertig ist. Jemand ne Idee?

DeddyH 7. Dez 2007 17:28

Re: Delphi Programm, im hintegrund cmd-befehle
 
Mal hier geschaut?

Eppos 7. Dez 2007 17:30

Re: Delphi Programm, im hintegrund cmd-befehle
 
naja gut und schön, aber das Dosfenster sieht man, aber ich möchte nicht das nman es sieht...

DeddyH 7. Dez 2007 17:34

Re: Delphi Programm, im hintegrund cmd-befehle
 
Auch bei Verwendung der ConsoleTools?

SirThornberry 7. Dez 2007 18:11

Re: Delphi Programm, im hintegrund cmd-befehle
 
ich weiß ehrlich gesagt nicht was so schlimm ist wenn der Nutzer ein Consolenfenster sieht. Dann weiß er wenigstens was gemacht wird! Das ist sogar üblich das Programme Consolenfenster zeigen (hatte ich erst heute bei der Installation der Grafikkartentreiber).
Wenn du Befehle über die cmd.exe ausführst solltest du diese auch anzeigen. Und wenn du nicht willst das etwas angezeigt wird lass doch die cmd.exe ganz aus dem spiel und nutze entsprechende Funktionen.

dominikkv 7. Dez 2007 18:25

Re: Delphi Programm, im hintegrund cmd-befehle
 
Zitat:

Zitat von DeddyH
Wenn der Rückgabewert von ShellExecute > 32 ist, hat die Ausführung an sich funktioniert, sofern ich die Hilfe richtig lesen kann.

ja das ausführen der cmd hat ja funktioniert... was ihr wollt ist die ausgabe der cmd, nicht die ausgabe von shellexecute :wink:
du musst halt die ausgabe der cmd zu deinem programm umlenken, dann kannst du nachschauen ob das funktioniert hat.

edit:

schau dir mal das hier an:
Delphi-Quellcode:
procedure CaptureDos(command: String; Stringsp: TStrings);
const
  CaptureBufferSize = 2500;
var
  SecAttrib          : TSecurityAttributes;
  ReadPipe,writePipe : THandle;
  Startup            : TStartUpInfo;
  ProcessInfo        : TProcessInformation;
  CaptureBuffer      : Pchar;
  BytesRead          : DWord;
  WaitHandle         : DWord;
begin
  Stringsp.clear;
  With SecAttrib do
    begin
      nlength             := SizeOf(TSecurityAttributes);
      binherithandle      := true;
      lpsecuritydescriptor := nil;
    end;
  if Createpipe (ReadPipe, writePipe, @SecAttrib, 0) then
    begin
      CaptureBuffer := AllocMem(CaptureBufferSize + 1);
      FillChar(Startup,Sizeof(Startup),#0);
      Startup.cb         := SizeOf(Startup);
      Startup.hStdOutput := writePipe;
      Startup.hStdInput  := ReadPipe;
      Startup.dwFlags    := STARTF_USESTDHANDLES +
                             STARTF_USESHOWWINDOW;
      Startup.wShowWindow := SW_HIDE;

      if CreateProcess(nil, PChar(command), @SecAttrib, @SecAttrib, true,
                       NORMAL_PRIORITY_CLASS, nil, nil, Startup, ProcessInfo) then
        begin
          repeat
            WaitHandle := WaitForSingleObject( ProcessInfo.hProcess,100);
            Application.ProcessMessages;
          until (WaitHandle <> WAIT_TIMEOUT) or application.terminated;
          if not application.terminated then
            Repeat
              BytesRead := 0;
              ReadFile(ReadPipe,CaptureBuffer[0],CaptureBufferSize,BytesRead,nil);
              CaptureBuffer[BytesRead]:= #0;
              OemToAnsi(CaptureBuffer,CaptureBuffer);
              Stringsp.Text := Stringsp.Text+String(CaptureBuffer);
            until (BytesRead < CaptureBufferSize);
        end else Stringsp.add('Fehler!');
      FreeMem(CaptureBuffer);
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
      CloseHandle(ReadPipe);
      CloseHandle(writePipe);
    end else Stringsp.add('Konnte Dos Kommando nicht starten, Fehler: #'
                          +inttostr(getlasterror));
end;
ist aber glaub ich auch mit sichtbarem fenster

DeddyH 7. Dez 2007 18:27

Re: Delphi Programm, im hintegrund cmd-befehle
 
Damit bist Du nun aber ein paar Posts zu spät ;)

dominikkv 7. Dez 2007 19:19

Re: Delphi Programm, im hintegrund cmd-befehle
 
Zitat:

Zitat von DeddyH
Damit bist Du nun aber ein paar Posts zu spät ;)

wollt nur mal anmerken :twisted: :warn:

Zitat:

Zitat von dominikkv
ist aber glaub ich auch mit sichtbarem fenster

haha pustekuchen... das ist genau das was du suchst :hi:

Eppos 10. Dez 2007 10:59

Re: Delphi Programm, im hintegrund cmd-befehle
 
coole Procedure, aber ich bekomme einen Fehler wenn ich das ausführen möchte:

Delphi-Quellcode:
  CaptureDos('/C del C:\test.exe', Memo1.Lines );

// das funktioniert auch nicht...

  CaptureDos('del C:\test.exe', Memo1.Lines );
 

// er schreibt in beiden fällen, in die Memo, "Fehler!"

mkinzler 10. Dez 2007 11:01

Re: Delphi Programm, im hintegrund cmd-befehle
 
Memo.Lines ist auch eine Property, welche du nicht als Var-Parameter übergeben kannst.

DeddyH 10. Dez 2007 11:10

Re: Delphi Programm, im hintegrund cmd-befehle
 
Ich frage mich nur die ganze Zeit, wieso er nicht einfach DeleteFile bemüht, anstatt mit DOS-Befehlen herumzuhantieren.

Eppos 10. Dez 2007 11:11

Re: Delphi Programm, im hintegrund cmd-befehle
 
warum schreibt er es dann in die Memo rein?

@DeddyH
weil ich auch noch andere befehle absätzen möchte...

DeddyH 10. Dez 2007 11:12

Re: Delphi Programm, im hintegrund cmd-befehle
 
Zitat:

Zitat von Eppos
@DeddyH
weil ich auch noch andere befehle absätzen möchte...

Und auch für die wird es wahrscheinlich entsprechende Methoden geben.

Eppos 10. Dez 2007 11:39

Re: Delphi Programm, im hintegrund cmd-befehle
 
ja das glaube ich alles,

aber bei 100 verschiedenen befehlen, aht man warscheinlich 500 Zeilen Quellcode!

aegidos 21. Jan 2008 10:41

Re: Delphi Programm, im hintegrund cmd-befehle
 
Hallo,
Ich habe ein Problem mit CreateProcess.
Mein Programm ließt eine Batch-Datei aus und startet dann jede Commandozeile in einem eigenen Prozess.
Die Befehle in der Batch:
Delphi-Quellcode:
rm %umg_variab%\protocol.xml
%umg_variab%\altovaXSLT2.exe -xml %umg_variab%\protocol.log -xsl %umg_variab%\protocol.xslt -out %umg_variab%\protocol.xml
Auf meinem EntwicklungsPC wird meine protocol.xml auch gelöscht und eine neue Protocol.xml aus dem Logfile erstellt. Wenn ich meine Anwendung auf einem anderen PC laufen lasse bekomme ich eine Fehlermeldung bei dem CreateProcess und zwar: eine Dialogbox :"Systemfehler. Code: 5. Zugriff verweigert ".

Was ich ausschließen kann:
-Umgebungsvariable nicht gesetzt
-Keine OpenUserrechte auf Festplatte
-Datei nicht vorhanden

Muss ich irgendwas auf dem PC installieren? Das Framework 1.1 ist auf dem Ziel PC Installiert und sonst auch die gleiche Software nur die Delphi 7 IDE fehlt, also kann ich nicht debuggen.

Delphi-Quellcode:
if not CreateProcess(
    nil,
    //PChar(CommandLine),
    PChar(strDummy),
    nil,
    nil,
    True,
    ProPri, // and CREATE_NEW_CONSOLE,
    nil,
    nil,
    StartupInfo,
    ProcessInfo)
//in strdummy steht genau eine Zeile aus der oben genannten Batch


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 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