Autor Beitrag
Gewuerzgurke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 152

Win XP
Lazarus
BeitragVerfasst: 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 user profile iconKlabautermann: Color- durch Delphi-Tags ersetzt
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 152

Win XP
Lazarus
BeitragVerfasst: Mo 26.10.09 18:05 
Habe ich auch erst gedacht und ewig nach dem Fehler gesucht...

Jedenfalls passiert bei
ausblenden Delphi-Quelltext
1:
if FileExists('winmine'then ShellExecute(0,'open',PChar('winmine'),nil,nil,SW_NORMAL);					

nichts. :nixweiss:
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 26.10.09 18:08 
Siehe oben..
FileExists IMMER mit absolutem Pfad.

_________________
PROGRAMMER: A device for converting coffee into software.
Gewuerzgurke Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 152

Win XP
Lazarus
BeitragVerfasst: 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:


Zuletzt bearbeitet von Gewuerzgurke am Mo 26.10.09 18:14, insgesamt 1-mal bearbeitet
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 152

Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 152

Win XP
Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 152

Win XP
Lazarus
BeitragVerfasst: Do 29.10.09 17:34 
So, diese Funktion kann alle meine Autostart-Einträge starten:
ausblenden volle Höhe 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) = 1then ShellReturn := ShellExecute(0,'open',
  PChar(Params[0]),nil,nil,SW_NORMAL);
 if (Length(Params) = 2then begin
  ShellReturn := ShellExecute(0,'open',PChar(Params[0] + ' ' + Params[1]),nil,
   nil,SW_NORMAL);
  if (ShellReturn = 2then ShellReturn := ShellExecute(0,'open',
   PChar(Params[0]),PChar(Params[1]),nil,SW_NORMAL);
 end;
 if (Length(Params) >= 3and (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) >= 3and (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 = 2then ShellReturn :=
   ShellExecute(0,'open',PChar(S + ' ' + P),nil,nil,SW_NORMAL);
  if (ShellReturn = 2then 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 <> 2and (ShellReturn <> 0then 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 :gruebel: . Trotzdem - hat noch jemand einen solchen Eintrag, der sowohl in Pfad als auch in Parametern Leerzeichen enthält?