Autor Beitrag
zakoon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: Di 18.11.08 14:00 
Hallo zusammen,

ich würde gerne einen beliebigen Befehl, der in einem String sitzt, über ShellExecute ausführen.

Normalerweise mache ich das in etwas so:
ausblenden Delphi-Quelltext
1:
ShellExecute(application.handle, 'open', PChar(strCommand), nilnil, SW_SHOWNORMAL);					

Leider ist es jetzt aber so, dass strCommand nicht nur einfache Befehle (wie z.B 'firefox.exe') beinhalten kann, sondern auch Parameter (wie z.B 'firefox /URL http://www.google.de/search?q=delphi').

Das funktioniert natürlich nicht mehr, da die Parameter ja ShellExecute getrennt übergeben werden müssten.

Mögliche Lösungen, die mir einfallen:
1. winExec benutzen. Funktioniert gut, "kennt" aber leider einige Windows-Befehle nicht (zB. 'msconfig'). Daher hier unbrauchbar.

2. strCommand in Befehl und Parameter parsen. Das ist aber ziemlich kompliziert, da es z.B. keine eindeutigen Indikatoren für den Start des Parameters gibt. " -" kann z.B. auch im Pfad vorkommen, die Endung des Programms kann unterschiedlich sein, oder auch fehlen, etc... Kennt jemand hierfür eine bereits fertige Function/Procedure?

3. Gibts noch etwas anderes?

Viele Grüße, Zak.

Moderiert von user profile iconmatze: Code- durch Delphi-Tags ersetzt
Timosch
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Di 18.11.08 14:12 
Ich würde bis zum ersten Leerzeichen parsen, schauen, ob die Datei existiert, wenn ja da trennen, wenn nein, bis zum zweiten Leerzeichen usw. Aber eigentlich sollte der Programmname inkl. Pfad ja in Anführungszeichen eingeschlossen sein, wenn er Leerzeichen enthält. Dann wärs ja wesentlich einfacher (einfach von " bis ").
WinExec richtet sich übrigens einfach nach der Umgebungsvariable PATH. Sollte man allerdings generell nicht mehr verwenden, weil es obsolet ist, in zukünftigen Versionen der Win32-API entfällt und z.T. offenbar schon unter Windows XP Probleme macht.

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 18.11.08 14:18 
Titel: So gehts ...
ausblenden Delphi-Quelltext
1:
ShellExecute(application.handle, 'open', PChar('"C:\Program Files (x86)\Mozilla Firefox\firefox.exe"'), PCHAR('/URL http://www.google.de/search?q=delphi'), nil, SW_SHOWNORMAL);					

MfG
Bummi

www.explido-software.de

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt
zakoon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: Di 18.11.08 14:33 
@Timosch, so leicht is es glaube ich eben nicht! Was ist mit Befehlen wie "msconfig /s", "cmd /k c:" und so weiter? Msconfig.exe liegt nicht mal in ner Path-Variable. Und wenn die Endung vom Programm fehlt, wie z.B. bei "c:\Programm\Mozilla\Firefox /url http://www.google.de"? Dann müsste ich irgendwie abchecken ob firefox.exe, firefox.bat, firefox.cmd, firefox.com etc.... existieren... Dann ist wiederum nicht auszuschließen, dass es Doppeldeutigkeiten gibt:
"c:\Programme\Firefox 3\Firefox /url http://www.google.de" wenn hier im Ordner "Programme" dann eine firefox.exe/ .bat/ .cmd liegt, habe ich z.B. ein Problem.

@Bummi, ich glaube du hast meine Frage nicht richtig gelesen. Oder nur nicht verstanden, was ich gemeint habe?


Zuletzt bearbeitet von zakoon am Di 18.11.08 14:43, insgesamt 1-mal bearbeitet
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 18.11.08 14:43 
Titel: Sorry war tatsächlich ein Missverständnis
IMHO, kann das zerlegen in Programm und Parameter nicht so schwer sein
Wenn kein führendes " dann erstes Leerzeichen ansonsten nächstes ".?
zakoon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: Di 18.11.08 14:44 
Titel: Re: Sorry war tatsächlich ein Missverständnis
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
IMHO, kann das zerlegen in Programm und Parameter nicht so schwer sein
Wenn kein führendes " dann erstes Leerzeichen ansonsten nächstes ".?


Es gibt Ordner und Programmnamen die Leerzeichen enthalten.
zakoon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: Di 18.11.08 14:45 
Titel: Re: Sorry war tatsächlich ein Missverständnis
jetzt hab ich auch was missverstanden ;-)

die " sind bisher nicht mit im String... vielleicht kann ich das aber einbauen...
Timosch
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Di 18.11.08 15:02 
user profile iconzakoon hat folgendes geschrieben Zum zitierten Posting springen:
@Timosch, so leicht is es glaube ich eben nicht! Was ist mit Befehlen wie "msconfig /s", "cmd /k c:" und so weiter? Msconfig.exe liegt nicht mal in ner Path-Variable. Und wenn die Endung vom Programm fehlt, wie z.B. bei "c:\Programm\Mozilla\Firefox /url http://www.google.de"? Dann müsste ich irgendwie abchecken ob firefox.exe, firefox.bat, firefox.cmd, firefox.com etc.... existieren... Dann ist wiederum nicht auszuschließen, dass es Doppeldeutigkeiten gibt:
"c:\Programme\Firefox 3\Firefox /url http://www.google.de" wenn hier im Ordner "Programme" dann eine firefox.exe/ .bat/ .cmd liegt, habe ich z.B. ein Problem.

@Bummi, ich glaube du hast meine Frage nicht richtig gelesen. Oder nur nicht verstanden, was ich gemeint habe?

Wenn mehrere Dateien existieren, die unterschiedliche Endungen haben, dann zuerst .com, wenn das nicht existiert, dann *.exe, dann *.bat, dann *.cmd.

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
zakoon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: Di 18.11.08 15:25 
Ich habs jetzt mit bummis Lösung gemacht, also zwinge den Anwender dazu ["] bei langen Pfaden zu verwenden. Die Lösung mit dem parsen des Strings, wie Timosch beschreibt, scheint mir unsicher, bzw. sehr aufwendig, wenn man es Ausnahmen-sicher hinbekommen möchte.

Danke euch beiden, für eure Vorschläge!
Wolle92
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: Di 18.11.08 16:21 
Teile den String einfach vor dem ersten Slash /...
Der darf in Datei-Ordnernamen nicht vorkommen, Pfade nutzen den Backslash \...

Und wenns keinen Slash gibt, gibts auch keine Parameter...

_________________
1405006117752879898543142606244511569936384000000000.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 18.11.08 17:34 
user profile iconWolle92 hat folgendes geschrieben Zum zitierten Posting springen:
Und wenns keinen Slash gibt, gibts auch keine Parameter...

Doch.

ausblenden Quelltext
1:
firefox yogularm.de					

Wo ist der Slash? yogularm.de ist ein einfacher Parameter.
Wolle92
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: Di 18.11.08 19:56 
mhm... doof...
hab ich gar nicht dran gedacht, obwohl ich ja den ping so oft verwende...

wie wärs mit dem ersten leerzeichen nach dem letzten backslash?

OK, gibt noch dateinamen mit leerzeichen...
also folgendes:
Bis zum letzten backslash gehen, dann zum nächsten leerzeichen, prüfen ob die datei mit allen möglichen endungen exisitiert, wenn nicht schon eine mit angegeben ist (einfach checken, ob es 3 zeichen zwischen punkt und ende gibt, und dann, ob diese 3 zeichen eine gültige Programmerweiterung darstellen...
und wenn die datei existiert, dann den rest als parameter nehmen...

_________________
1405006117752879898543142606244511569936384000000000.
zakoon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60



BeitragVerfasst: Do 20.11.08 20:09 
user profile iconWolle92 hat folgendes geschrieben Zum zitierten Posting springen:
mhm... doof...
hab ich gar nicht dran gedacht, obwohl ich ja den ping so oft verwende...

wie wärs mit dem ersten leerzeichen nach dem letzten backslash?

OK, gibt noch dateinamen mit leerzeichen...
also folgendes:
Bis zum letzten backslash gehen, dann zum nächsten leerzeichen, prüfen ob die datei mit allen möglichen endungen exisitiert, wenn nicht schon eine mit angegeben ist (einfach checken, ob es 3 zeichen zwischen punkt und ende gibt, und dann, ob diese 3 zeichen eine gültige Programmerweiterung darstellen...
und wenn die datei existiert, dann den rest als parameter nehmen...


Was machst du dann mit Parameter, die mehrere Backslahes beinhalten? "cmd /k /d".
Was wenn im Parameter noch ein Dateipfad übergeben wird, und dannach nochmal ein Backslash folgt? Was ist wenn die Erweiterung beim Programmname fehlt?
Ich sags euch, das ist echt nicht so einfach.
Wolle92
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: Do 20.11.08 23:26 
du übergibts alle programmparameter in einem einzigen Funktions-Parameter...

das heißt, du musst nur zwischen Programm und "alle Parameter" trennen...

Nur das mit den Backslashes in den Parametern ist doof...
Aber "cmd /k /d" beinhaltet zwei Slashes, ohne Back...

_________________
1405006117752879898543142606244511569936384000000000.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 21.11.08 09:17 
Wie wäre es ganz einfach mit CreateProcess...
Da kann die gesamte Kommandozeile in einem Stück übergeben werden ohne Abtrennung der Parameter.
kandesbunzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 116
Erhaltene Danke: 1


Delphi 7, XE2
BeitragVerfasst: Mo 24.11.08 14:33 
Gibt es hierfür ein einfaches Beispiel? CreateProcess ist doch deutlich komlexer als ShellExecute ...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 24.11.08 17:14 
In diesem Thread siehst du die Verwendung, gibt noch viele mehr, vielleicht auch in der Library:
www.delphi-forum.de/....php?p=532592#532592