AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

ShellExecute

Ein Thema von Kratos · begonnen am 8. Jun 2020 · letzter Beitrag vom 26. Mär 2021
Antwort Antwort
Kratos

Registriert seit: 15. Okt 2019
52 Beiträge
 
Delphi 10.3 Rio
 
#1

ShellExecute

  Alt 8. Jun 2020, 10:39
Delphi-Version: 10.3 Rio
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:
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;
Wo genau liegt mein Fehler?
Vielen Dank im Voraus für eure Mühen

VG Kratos
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.777 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: ShellExecute

  Alt 8. Jun 2020, 10:47
.. wo liegt denn das Batch file?

Welchen Wert spuckt denn shellExecute aus?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Kratos

Registriert seit: 15. Okt 2019
52 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: ShellExecute

  Alt 8. Jun 2020, 10:55
@Klaus01

Das Batch file hab ich parallel zu meiner Programm-exe abgelegt, daher ParamStr .

Was meinst du mit Wert bezüglich ShellExecute?
Wo finde ich diesen Rückgabewert?^^


@TiGü

Danke dir. Ich werde es gleich mal versuchen.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.071 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: ShellExecute

  Alt 8. Jun 2020, 10:51
Code:
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;
Wo genau liegt mein Fehler?
Du wertest den Rückgabewert von ShellExecute nicht aus!

Delphi-Quellcode:
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;
Wenn jetzt ein Fehlercode angezeigt wird, kannst du von dort aus weitermachen.
Ich tippe ja auf Nummer 5 (SE_ERR_ACCESSDENIED).
Doku dazu: https://docs.microsoft.com/en-us/win...-shellexecutea
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#5

AW: ShellExecute

  Alt 8. Jun 2020, 10:59
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.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas ( 8. Jun 2020 um 11:04 Uhr)
  Mit Zitat antworten Zitat
Kratos

Registriert seit: 15. Okt 2019
52 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: ShellExecute

  Alt 8. Jun 2020, 11:11
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.^^
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#7

AW: ShellExecute

  Alt 8. Jun 2020, 11:12
@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;
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Kratos

Registriert seit: 15. Okt 2019
52 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: ShellExecute

  Alt 8. Jun 2020, 11:20
@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?
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#9

AW: ShellExecute

  Alt 8. Jun 2020, 12:54
@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.^^
@Kratos: Da dein Problem behoben zu sein scheint, möchte ich nochmal hier drauf eingehen (s.o.).
Das hört sich nach einer Update-Routine an.
Klingt evtl. etwas merkwürdig aber ich würde es (gerade zum Lernen) an deiner Stelle auch in Delphi schreiben.
Insbesondere wenn solche Update-Routinen später etwas umfangreicher werden, z.B. mit der Einbindung einer Möglichkeit des Rollback, falls das Update fehlschlägt etc. wird das in einer Batch nachher schnell unübersichtlich oder auch nicht praktikabel.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Kratos

Registriert seit: 15. Okt 2019
52 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: ShellExecute

  Alt 8. Jun 2020, 13:15
@jaenicke

Git und SVN sind mir bekannt, auch wenn ich diese noch nicht genutzt habe.
Danke für deinen Tipp, nun scheint es wohl doch an der Zeit zu sein, dass ich mich näher damit beschäftige.^^

@Moombas

Du liegts richtig. Ich wollte eine abgespeckte Update-Routine implementieren.
Wenn ich dies ebenfalls in delphi programmieren soll, sollte man dies gleich mit in das Hauptprogramm mit rein nehmen oder sollte ich ein weiteres Programm schreiben, welches ich aus meinem Hauptprogramm heraus starte?
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 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