Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - FileExists findet keine Dateien in system32 - Alternative?
Gewuerzgurke - Mo 26.10.09 17:52
Titel: FileExists findet keine Dateien in system32 - Alternative?
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 - 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.
Gewuerzgurke - 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. :nixweiss:
Xentar - Mo 26.10.09 18:08
Siehe oben..
FileExists IMMER mit absolutem Pfad.
Gewuerzgurke - 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 :wink:
Xentar - 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.
Gewuerzgurke - 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 - 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?
Gewuerzgurke - 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 :mrgreen: )
Gewuerzgurke - Do 29.10.09 17:34
So, diese Funktion kann alle meine Autostart-Einträge starten:
Delphi-Quelltext
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:
http://www.delphipraxis.net/topic3816_ein+dynamisches+array+aus+einem+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 :gruebel: . Trotzdem - hat noch jemand einen solchen Eintrag, der sowohl in Pfad als auch in Parametern Leerzeichen enthält?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!