Autor |
Beitrag |
Gewuerzgurke
      
Beiträge: 152
Win XP
Lazarus
|
Verfasst: Mo 26.10.09 17:52
Hallo, ich möchte verschiedene Anwendungen, die in einer Liste stehen, ausführen (Mit ShellExecute). Um z.B. Fehleinträge zu entlarven, prüfe ich vorher mit FileExists, ob die Anwendung auch existiert.
Problem: Während ShellExecute auch Dateien, die im Path von Windows oder in system32 stehen (Z.B. ShellExecute(0,'open',PChar('winmine.exe'),nil,nil,SW_NORMAL); oder sogar ShellExecute(0,'open',PChar('winmine'),nil,nil,SW_NORMAL);), öffnet, findet FileExists diese nicht.
Gibt es da eine Alternative?
Ich meine, den Path auslesen und für jeden Pfad einzeln Prüfen, ob da die gesuchte Datei drinn' steht, ist doch etwas mühselig...
Moderiert von Klabautermann: Color- durch Delphi-Tags ersetzt
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 26.10.09 17:57
Sollte FileExists eigentlich auch können. Falsch angewandt?
Edit: Bitte sag mir, dass du NICHT If FileExists('winmine.exe') then .. ausführst..
Gib das Verzeichnis mit an!
ShellExecute funktioniert damit nur, weil system32 als Path eingetragen ist. FileExists verwendet diese jedoch nicht.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Gewuerzgurke 
      
Beiträge: 152
Win XP
Lazarus
|
Verfasst: Mo 26.10.09 18:05
Habe ich auch erst gedacht und ewig nach dem Fehler gesucht...
Jedenfalls passiert bei
Delphi-Quelltext 1:
| if FileExists('winmine') then ShellExecute(0,'open',PChar('winmine'),nil,nil,SW_NORMAL); |
nichts. 
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 26.10.09 18:08
Siehe oben..
FileExists IMMER mit absolutem Pfad.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Gewuerzgurke 
      
Beiträge: 152
Win XP
Lazarus
|
Verfasst: Mo 26.10.09 18:10
Ja... Ich hatte schon geantwortet...
Ich muss also wirklich den Path auslesen und "durchsteppen"?
[Edit] @Klabautermann: Danke, werd' ich in Zukunft beachten 
Zuletzt bearbeitet von Gewuerzgurke am Mo 26.10.09 18:14, insgesamt 1-mal bearbeitet
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 26.10.09 18:13
Achso, doh, übersehen.
Was passiert denn, wenn man ShellExecute mit ner Datei aufruft, die es nicht gibt? Exception? Wenn ja, diese abfangen - dann hättest du auch deine Lösung, ob es die Datei gibt
Ansonsten musst du wohl doch den Path auseinandernehmen, und einzeln prüfen.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 26.10.09 18:17
es gibt einen rückgabewert in form einer nummer
msdn.microsoft.com/e...bb762153(VS.85).aspx
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Gewuerzgurke 
      
Beiträge: 152
Win XP
Lazarus
|
Verfasst: Mo 26.10.09 18:29
An den Rückgabewert habe ich auch schon gedacht aber wenn das Programm existiert, wird es dann auch schon ausgeführt und ich kann keine Parameter mehr übergeben.
Die Parameter sind zu diesem Zeitpunkt noch nicht fertig, weil diese erst dann bekannt sind, wenn das Programm weiß, wo der Dateiname aufhört und die Parameter anfangen. Dateiname und Parameter sind zusammenhängend, wie im Autostart. (Dieser ist auch eine der Listen, die ausgeführt werden)
Gibt es möglicher Weise eine besondere Funktion, die solche Werte Interpretiert?
Wie ich sehe, ist es doch schwieriger als ich dachte, diese Werte zu "zerhacken".
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 26.10.09 18:48
Hast du dafür mal bitte ein Beispiel?
Normalerweise sind Dateiname und Parameter durch ein simples Leerzeichen getrennt. Wenn in einem von beiden Leerzeichen vorkommen, wird das halt durch ein "" eingeschlossen.
Ist doch nen simpler TStringList.DelimitedText, wobei der Delimiter ein Leerzeichen wär?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Gewuerzgurke 
      
Beiträge: 152
Win XP
Lazarus
|
Verfasst: Mo 26.10.09 19:23
Achsooo, wenn alle Dateipfade, die Leerzeichen und Parameter haben, durch Gänsefüßchen eingeschlossen sind, sollte ich das in den Griff bekommen.
Ich poste dann die Tage mal eine Funktion, die diese Eventualitäten bedenkt.
(Mein jetziger Quelltext ist etwas ... naja unordentlich  )
|
|
Gewuerzgurke 
      
Beiträge: 152
Win XP
Lazarus
|
Verfasst: Do 29.10.09 17:34
So, diese Funktion kann alle meine Autostart-Einträge starten:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| function ExecuteRegEntry(const Entry : AnsiString) : Boolean; var Params : TStringDynArray; ShellReturn, i : integer; S,P : PChar; begin Result := false; ShellReturn := 0; Params := Explode(' ',Entry,0); if (Length(Params) = 1) then ShellReturn := ShellExecute(0,'open', PChar(Params[0]),nil,nil,SW_NORMAL); if (Length(Params) = 2) then begin ShellReturn := ShellExecute(0,'open',PChar(Params[0] + ' ' + Params[1]),nil, nil,SW_NORMAL); if (ShellReturn = 2) then ShellReturn := ShellExecute(0,'open', PChar(Params[0]),PChar(Params[1]),nil,SW_NORMAL); end; if (Length(Params) >= 3) and (Params[0][1] = '"') then begin S := PChar(Params[0]); for i := 1 to Length(Params) - 1 do begin S := PChar(S + ' ' + Params[i]); if (Params[i][Length(Params[i])] = '"') then break; end; P := PChar(Params[i + 1]); for i := i + 2 to Length(Params) - 1 do P := PChar(P + ' ' + Params[i]); ShellReturn := ShellExecute(0,'open',S,P,nil,SW_NORMAL); end; if (Length(Params) >= 3) and (Params[0][1] <> '"') then begin S := PChar(Params[0]); for i := 1 to Length(Params) - 2 do S := PChar(S + ' ' + Params[i]); P := PChar(Params[Length(Params) - 1]); ShellReturn := ShellExecute(0,'open',S,P,nil,SW_NORMAL); if (ShellReturn = 2) then ShellReturn := ShellExecute(0,'open',PChar(S + ' ' + P),nil,nil,SW_NORMAL); if (ShellReturn = 2) then begin S := PChar(Params[0]); P := PChar(Params[1]); for i := 2 to Length(Params) - 1 do P := PChar(P + ' ' + Params[i]); ShellReturn := ShellExecute(0,'open',S,P,nil,SW_NORMAL); end; end; if (ShellReturn <> 2) and (ShellReturn <> 0) then Result := true; end; |
Ich habe mir erlaubt, die fertige Explode-Funktion von hier zu verwenden: www.delphipraxis.net...string+erzeugen.html
Die Funktion erwartet den Wert des zustartenden Eintrags und gibt true aus, wenn's erfolgreich gestartet wurde.
Danke an alle, die geholfen haben
Unglücklicher Weise habe ich auch diesen Eintrag bei mir entdeckt: C:\Programme\ATI Technologies\ATI.ACE\cli.exe runtime -Delay, für ATI-CLI. Ich hatte den mal 'raus genommen und wieder manuell eingetragen, als ich dachte, ohne würden Fehler entstehen (Stimmt glaube ich aber nicht...), vielleicht habe ich da die Gänsefüßchen vergessen. Die cli.exe steht sowieso in C:\Programme\ATI Technologies\ATI.ACE\Core-Static\cli.exe  . Trotzdem - hat noch jemand einen solchen Eintrag, der sowohl in Pfad als auch in Parametern Leerzeichen enthält?
|
|
|