![]() |
Delphi-Version: 10.3 Rio
ShellExecute
Hallo Leute,
ich bin Delphi-Neuling und habe jetzt schon etliche Forenseiten durchforstet. Ich möchte aus meinem delphi-Programm heraus eine .bat-Datei ausführen. In dieser lösche, kopiere und führe ich jeweils eine Textdatei aus. Das ganze soll über cmd laufen. Wenn ich die .bat-Datei manuell ausführe, funktioniert alles wie gewünscht. Aus delphi heraus, passiert nichts. Es bearbeitet meine Dateien nicht und gibt auch keinen Fehler aus. Laut Debugger durchläuft es aber meine "ShellExecute"-Programmzeile.
Code:
Wo genau liegt mein Fehler?
procedure TForm5.pnlUpdateMessageClick(Sender: TObject);
begin try ShellExecute(0, 'open', 'cmd', PChar('/c ' + (ParamStr(0) + '_DELETE_COPY_EXECUTE.bat')), nil, SW_SHOWNORMAL); ShowMessage('Alte Version gelöscht.'); except ShowMessage('Fehler'); end; end; Vielen Dank im Voraus für eure Mühen VG Kratos |
AW: ShellExecute
.. wo liegt denn das Batch file?
Welchen Wert spuckt denn shellExecute aus? Grüße Klaus |
AW: ShellExecute
Zitat:
Delphi-Quellcode:
Wenn jetzt ein Fehlercode angezeigt wird, kannst du von dort aus weitermachen.
procedure TForm5.pnlUpdateMessageClick(Sender: TObject);
var ExecResult: Integer begin try ExecResult := ShellExecute(0, 'open', 'cmd', PChar('/c ' + (ParamStr(0) + '_DELETE_COPY_EXECUTE.bat')), nil, SW_SHOWNORMAL); if ExecResult <= 32 then ShowMessage('Fehlercode: ' + IntToStr(ExecResult)); ShowMessage('Alte Version gelöscht.'); except ShowMessage('Fehler'); end; end; Ich tippe ja auf Nummer 5 (SE_ERR_ACCESSDENIED). Doku dazu: ![]() |
AW: ShellExecute
@Klaus01
Das Batch file hab ich parallel zu meiner Programm-exe abgelegt, daher
Delphi-Quellcode:
.
ParamStr
Was meinst du mit Wert bezüglich ShellExecute? Wo finde ich diesen Rückgabewert?^^ @TiGü Danke dir. Ich werde es gleich mal versuchen. |
AW: ShellExecute
Anmerkung: ParamStr(0) gibt einem doch folgendes aus (Pfad ist Beispielhaft): C:\PROGRAM FILES\BORLAND\DELPHI7\PROJECTS\PROJECT1.EXE
Somit kann er die Batch nicht ausführen, denn daraus würde sich ergeben: (Pfad ist Beispielhaft) C:\PROGRAM FILES\BORLAND\DELPHI7\PROJECTS\PROJECT1.EXE_DELETE_COPY_EXECUTE.bat Ersetze ParamStr(0) durch ExtractFilePath(ParamStr(0)). Dann sollte es funktionieren. Schöner: Und versuche doch das, was du in der Batch-Datei machst im Delphi-Programm einzubauen. :) |
AW: ShellExecute
Also ersteinmal vielen lieben Dank für eure ganzen Tipps.
meine Prozedur sieht jetzt so aus:
Code:
procedure TForm5.pnlUpdateMessageClick(Sender: TObject);
var ExecResult: Integer; begin try ExecResult := ShellExecute(0, 'open', 'cmd', PChar('/c ' + ExtractFilePath(ParamStr(0) + '_DELETE_COPY_EXECUTE.bat')), nil, SW_SHOWNORMAL); ShowMessage(IntToStr(ExecResult)); except ShowMessage('Fehler'); end; end; Leider funktioniert es immer noch nicht. @Klaus01 Der Rückgabewert beträgt 42. @Moombas Ich möchte später mein eigenes Programm schließen, die alte exe löschen, eine neue exe in den Ordner kopieren und anschließend wieder ausführen lassen. Deswegen hatte ich mir gedacht, dass ich das ganze in eine batch-Datei auslagere und schon mal mit einfachen Textdateien diesen Vorgang übe.^^ |
AW: ShellExecute
@Kratos du wendest es ja auch falsch an:
So wäre es richtig:
Delphi-Quellcode:
procedure TForm5.pnlUpdateMessageClick(Sender: TObject);
var ExecResult: Integer; begin try ExecResult := ShellExecute(0, 'open', 'cmd', PChar('/c ' + ExtractFilePath(ParamStr(0)) + '_DELETE_COPY_EXECUTE.bat'), nil, SW_SHOWNORMAL); ShowMessage(IntToStr(ExecResult)); except ShowMessage('Fehler'); end; end; |
AW: ShellExecute
@Moombas
Ich habe deine Klammeränderung übernommen. Jedoch wird die .bat anscheinend immer noch nicht ausgeführt. Es ist doch richtig, dass meine bat wie folgt lautet: Programm.exe_DELETE_COPY_EXECUTE.bat? |
AW: ShellExecute
Nein :) Das war ein Beispiel um zu zeigen, das diese nicht ausgeführt werden kann, weil der Name falsch zusammen gesetzt wird.
Deine .Bat behält deinen gewünschten Namen (_DELETE_COPY_EXECUTE.bat). Du kannst zur Kontrolle auch temporär dir die Zusammensetzung mal ausgeben lassen (hilft evtl. dabei das zu verstehen):
Delphi-Quellcode:
procedure TForm5.pnlUpdateMessageClick(Sender: TObject);
var ExecResult: Integer begin try ShowMessage(ParamStr(0) + '_DELETE_COPY_EXECUTE.bat'); //nur zum evtl. besseren Verständnis, kann im eigentlichen Code nachher raus! ShowMessage(ExtractFilePath(ParamStr(0)) + '_DELETE_COPY_EXECUTE.bat'); //nur zum evtl. besseren Verständnis, kann im eigentlichen Code nachher raus! ExecResult := ShellExecute(0, 'open', 'cmd', PChar('/c ' + ExtractFilePath(ParamStr(0)) + '_DELETE_COPY_EXECUTE.bat'), nil, SW_SHOWNORMAL); //so wäre es richtig, der Dateiname bleibt "_DELETE_COPY_EXECUTE.bat" if ExecResult <= 32 then ShowMessage('Fehlercode: ' + IntToStr(ExecResult)); ShowMessage('Alte Version gelöscht.'); except ShowMessage('Fehler'); end; end; |
AW: ShellExecute
Ich will kein Schlauscheißer sein, aber auf lange Sicht wirst du nicht glücklich wenn sich die Fehleranalyse auf "Geht irgendwie" und "Geht irgendwie nicht" beschränkt. Speicher dir das ganze String-Gewurstel doch in einer extra Variable und nutze den Debugger. Dann kannst du dir den Inhalt der Variable anschauen und siehst wo das Problem ist.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 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 by Thomas Breitkreuz