AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Konventionen für Parameter in ShellExecute
Thema durchsuchen
Ansicht
Themen-Optionen

Konventionen für Parameter in ShellExecute

Ein Thema von oki · begonnen am 25. Mär 2009 · letzter Beitrag vom 25. Mär 2009
Antwort Antwort
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

Konventionen für Parameter in ShellExecute

  Alt 25. Mär 2009, 17:06
Hi Leute,

eigentlich will ich auf was spezielles raus, aber der Bezug geht auf ShellExecute zurück. Bei der Angabe von Parametern zu ausführbaren Dateien (wie z.B. in ShellExecute benutzt) können unter anderem auch Pfade für Dateien angegeben werden.

Hier gelten ja jetzt spezielle Konventionen, wie diese Pfadangaben zu erfolgen haben. Eine davon ist, dass ein Pfad, der Leerzeichen enthält, in Hochkommata anzugeben ist. Leider kenne ich jetzt nicht alle gültigen Konventionen für die Arten der Angabe von Pfaden in diesem Fall.

Somit ergeben sich mehrere Fragen:
Welche Zeichen grenzen einen vollsändigen Pfad ein und sind hierfür zulässig? (nur ' oder auch " oder noch andere?)
Welche Zeichen können auch innerhalb des Pfades auftreten und wie formatiert man das dann, damit dort nicht das Ende erkannt wird?
Welche Konventionen gelten dafür überhaupt, gibt es noch weitere?

Ich muss hier leider zugeben, dass mein Wissen zu diesem Thema doch recht oberflächlich ist. Dustere Erinnerungen aus den alten DOS-Zeiten helfen mir auch nicht weiter. So richtig weis ich auch nicht, nach welchem Stichwort ich suchen soll. Hab bei Google und Wiki bis jetzt nur was allgemeines zu Pfaden gefunden, was mir nicht hilft.

Ein gutes Stichwort für meine Suche reicht schon. Lesen kann ich dann bestimmt auch selber

Ich danke euch schon mal für eure Gedult,

Gruß oki
42
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Konventionen für Parameter in ShellExecute

  Alt 25. Mär 2009, 18:04
Kommt drauf an, was du mit ShellExecute ausführen / öffnen willst. Programme damit zu starten ist eh "von hinten durch's Knie ins Auge", dafür sind andere Sachen da.

Und Konventionen gelten da genauso wie für die Kommandozeile. Ein " ist als Zeichen im Dateinamen ohnehin verboten, somit kannst du da auch die Pfade mit eingrenzen.

Wobei ich jetzt nicht sicher bin, ob du Pfade bei ShellExecute überhaupt in Anführungszeichen setzen musst. Würde fast mal behaupten "Nein".

Anders schauts da aus, wenn du über den Kommando-Interpreter Programme starten willst: ShellExecute (Handle, 'open', 'cmd.exe /C "C:\Program Files\xyz\xyz.exe"', ...)
Da mußt du aber wissen, was für ein OS auf dem Zielrechner läuft. Weil wenn du Pech hast und jemand hat noch Windows ME oder noch niedriger, ists statt cmd.exe command.com. Von daher nimm lieber CreateProcess zum Starten von Programmen.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Konventionen für Parameter in ShellExecute

  Alt 25. Mär 2009, 18:49
Hi nuclearping,

so, Abendbrot zu Ende. Erst mal Dank für deine Antwort.
Als erstes zum Thema ShellExecute. Warum ist das von hinten durch die Brust? OK, ich benutzte ShellExecuteEx, damit ein Handle bekomme. CreateProcess benutze ich aus einem ganz speziellen Grund nicht. Es gibt unterschiedliche Arten, wie ich mit einer Funktion Anwendungen ausführen will.
1. eine Exe soll gestartet werden,
2. eine Exe soll mit Parametern gestartet werden die sowohl Pfade wie auch Ausführungskommandos enthalten,
3. Dateien sollen mit ihren "korrespondierenden" Programmen angezeigt werden.

Da die Dateien, Programme und Parameter zur Laufzeit übergeben werden, sind mir diese vorher nicht bekannt. Die werden über eine Art ini (nur als Vergleich, wie genau ist hier egal) gelesen. Derjenige, der diese Angaben erstellt soll eigentlich unter den allgemein üblichen Konventionen für eventuelle Pfadangaben arbeiten. Da hier aber auch Pfade benutzt werden sollen, sie zur Erstellungszeit nicht bekannt sind, will Platzhalter verwenden lassen. Ein Beispiel sieht so aus:
{app}\Pictures\MyPicture.jpg
oder
{app}\My Pictures\MyPicture.jpg
Und schon habe ich mehrere Probleme. Erstens, ich muss meinen Platzhalter {app} erkennen (ok, kein Problem), diesen in den absoluten Pfad auf dem System umwandeln, in dem mein Programm liegt (ok, auch kein Problem). Dann aber auch den kompletten Pfad extrahieren. Der angegebene Parameter kann ja auch so aussehen:
/p {app}\My Pictures\MyPicture.jpg
oder korrekter weise so:
/p "{app}\My Pictures\MyPicture.jpg"
Daraus soll folgendes entstehen:
/p "F:\Programme\My Application\My Pictures\MyPicture.jpg"

Ich habe hier also mehrere Such- und Zerlegeaufgaben zu erfüllen. Um den gesamten Pfad zu finden kann ich jetzt natürlich nach {app} suchen. Kein Thema. Danach muss ich aber auch den Rest des Pfades finden um die Ersetzung vornehmen zu können. Also schauen, ob davor " steht oder was noch so erlaubt ist und dann mit dem gleichen Zeichen das Ende finden. Am Rande bemerkt, es reicht nicht, nur direkt {app} im Parameter zu ersetzen. Ich brauche auch den Rest des Pfades. app ist nur ein einfaches beispiel wo es auch ohne den Rest gehen würde.

Damit mich im Nachgang keiner belehrt was das noch so alles erlaubt ist möchte ich es gleich richtig machen und auf alle erlaubten Zeichen prüfen die einen Pfad einschließen dürfen.

Puh, langer Text.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Konventionen für Parameter in ShellExecute

  Alt 25. Mär 2009, 18:52
Erstell doch einfach mal im Windows-Explorer einen neuen Ordner und versuche, einen Slash oder Backslash im Namen einzugeben. Zumindest XP sagt Dir dann von alleine, welche Zeichen nicht erlaubt sind
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Konventionen für Parameter in ShellExecute

  Alt 25. Mär 2009, 19:16
Als Parameter übergeben mußt du sie natürlich in Hochkommas setzen, ja.

ShellExecute ist zB für Dateien gedacht, um sie mit deren verknüpften Programmen zu öffnen.

Aber auch mit CreateProcess kannst du Anwendungen Parameter übergeben:
(http://www.hitekdev.com/delphi/winexecandwait.html)
Delphi-Quellcode:
function WinExecAndWait32(FileName:String; Visibility : integer):integer;
var
  zAppName:array[0..512] of char;
  zCurDir:array[0..255] of char;
  WorkDir:String;
  StartupInfo:TStartupInfo;
  ProcessInfo:TProcessInformation;
begin
  StrPCopy(zAppName,FileName);
  GetDir(0,WorkDir);
  StrPCopy(zCurDir,WorkDir);
  FillChar(StartupInfo,Sizeof(StartupInfo),#0);
  StartupInfo.cb := Sizeof(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := Visibility;
  if not CreateProcess(nil,
    zAppName, { pointer to command line string }
    nil, { pointer to process security attributes }
    nil, { pointer to thread security attributes }
    false, { handle inheritance flag }
    CREATE_NEW_CONSOLE or { creation flags }
    NORMAL_PRIORITY_CLASS,
    nil, { pointer to new environment block }
    nil, { pointer to current directory name }
    StartupInfo, { pointer to STARTUPINFO }
    ProcessInfo) then Result := -1 { pointer to PROCESS_INF }
  else begin
    WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess,Result);
  end;
end;

// Aufruf
WinExecAndWait32 ('C:\Program Files\xyz\xyz.exe /p "F:\My Files\..."', SW_SHOW);
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Konventionen für Parameter in ShellExecute

  Alt 25. Mär 2009, 20:32
hi,

@deddyh: die einfachsten Ideen sind doch immer die besten Danke!

@nuclearping: Dank für den Code. Sorry, aber ich werd jetzt mal bei meinem ShellExecude bleiben. Das ist eigentlich auch nicht das Thema. Mir geht es um die Pfade. Da bis jetzt keiner erwähnt hat, dass auch andere Zeichen als " zulässig sind, werd ich nur diese berückdichtigen.

Ich mach die Frage dann mal dicht.

Dank an alle und Gruß

oki
42
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz