![]() |
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! |
Re: Delphi Programm, im hintegrund cmd-befehle
Such mal nach ... ShellExecute()
:gruebel: Is doch net schlimm, wenn der Anwender ne "black box" sieht oder? |
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! |
Re: Delphi Programm, im hintegrund cmd-befehle
Zitat:
Da drängt sich jetzt direkt die Frage auf was das für ein Programm ist ?!? |
Re: Delphi Programm, im hintegrund cmd-befehle
![]() :warn: Lass den Nutzer immer wissen, was das Programm macht! |
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? |
Re: Delphi Programm, im hintegrund cmd-befehle
Wenn Du ShellExecute schon gefunden hast, schau Dir mal den letzten Parameter genau an ;)
|
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: ![]() ![]() und bei ShellExecute, weiss ich nicht, wo da noch platz für den Befehl sein soll. Als Parameter? |
Re: Delphi Programm, im hintegrund cmd-befehle
test.exe ist nicht zufällig dein Programm?
|
Re: Delphi Programm, im hintegrund cmd-befehle
:lol: NEIN
|
Re: Delphi Programm, im hintegrund cmd-befehle
Zitat:
|
Re: Delphi Programm, im hintegrund cmd-befehle
also ich habe folgendes gemacht:
Delphi-Quellcode:
aber so funktioniert das nicht?!
ShellExecute(0, Nil, PChar('cmd'), Pchar('del C:\test.exe'), Pchar(''), SW_NORMAL);
Hat jemand vielelicht ne idee, wie es richtet geht?! Danke! |
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:
[/edit]
ShellExecute(Handle,'open','cmd','/c dir c:\windows',nil,SW_SHOWDEFAULT);
|
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? |
Re: Delphi Programm, im hintegrund cmd-befehle
-Lenke das Ergebnis in eine Textdatei um und parse diese
-oder verwende CreateProcess() |
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? |
Re: Delphi Programm, im hintegrund cmd-befehle
Was hast du gemacht?
|
Re: Delphi Programm, im hintegrund cmd-befehle
Delphi-Quellcode:
Gibt es auch die möglichkeit, wenn es geklappt, dass ich dann Ture bzw. False zurückbekomme?!
Memo1.Lines.AddStrings( ShellExecute(Handle,'open','cmd','/c del C:\test.exe',nil, SW_HIDE) );
|
Re: Delphi Programm, im hintegrund cmd-befehle
Schau dir mal die Rückgabewerte von ShellExecute() an.
|
Re: Delphi Programm, im hintegrund cmd-befehle
ok, bekomme aber als Fehlercode 42 raus?!
|
Re: Delphi Programm, im hintegrund cmd-befehle
Hast Du richtig nachgelesen?
|
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?! |
Re: Delphi Programm, im hintegrund cmd-befehle
Zitat:
|
Re: Delphi Programm, im hintegrund cmd-befehle
Also ich führe über ShellExecute folgende Befehl aus:
Delphi-Quellcode:
Diese Datei (test.exe) existiert aber nicht, absichtlich.
ShellExecute(Handle,'open','cmd','/c del C:\test.exe',nil, SW_HIDE);
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 |
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.
|
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? |
Re: Delphi Programm, im hintegrund cmd-befehle
Mal
![]() |
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...
|
Re: Delphi Programm, im hintegrund cmd-befehle
Auch bei Verwendung der ConsoleTools?
|
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. |
Re: Delphi Programm, im hintegrund cmd-befehle
Zitat:
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:
ist aber glaub ich auch mit sichtbarem fenster
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; |
Re: Delphi Programm, im hintegrund cmd-befehle
Damit bist Du nun aber ein paar Posts zu spät ;)
|
Re: Delphi Programm, im hintegrund cmd-befehle
Zitat:
Zitat:
|
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!" |
Re: Delphi Programm, im hintegrund cmd-befehle
Memo.Lines ist auch eine Property, welche du nicht als Var-Parameter übergeben kannst.
|
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.
|
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... |
Re: Delphi Programm, im hintegrund cmd-befehle
Zitat:
|
Re: Delphi Programm, im hintegrund cmd-befehle
ja das glaube ich alles,
aber bei 100 verschiedenen befehlen, aht man warscheinlich 500 Zeilen Quellcode! |
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:
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 ".
rm %umg_variab%\protocol.xml
%umg_variab%\altovaXSLT2.exe -xml %umg_variab%\protocol.log -xsl %umg_variab%\protocol.xslt -out %umg_variab%\protocol.xml 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. |
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