![]() |
ShellExecute ohne genauen Pfad?
Gibt es irgendeine Möglichkeit, ShellExecute zu nutzen, ohne einen genauen Pfad zu kennen? Also praktisch die Datei suchen und sofort ausführen? Und wenn ja, wie geht das? ^^
|
Re: ShellExecute ohne genauen Pfad?
ShellExecute findet alle Programme im Pfad. "Notepad.exe" funktioniert also.
Wenn man es mit einem Dateinamen aufruft, so findet es das zugewiesene Programm. |
Re: ShellExecute ohne genauen Pfad?
Notepad.exe kann man ja auch einfach starten, aber bei jedem anderen Programm, das ich ausprobiert hab, nicht :gruebel:
Auch bei den Programmen, wo ich mir sicher bin, dass es den Programmnamen nur einmal auf meiner Festplatte geht, startet er nicht... Was ist übrigens bei den Programmen, deren Name mehrfach auf einer Festplatte vertreten sind? |
Re: ShellExecute ohne genauen Pfad?
Es gilt der Suchpfad, also aktuelles Verzeichnis, dann die Verzeichnisse der PATH-Umgebungsvariablen und dann das Windows-Verzeichnis.
|
Re: ShellExecute ohne genauen Pfad?
Zitat:
Wenn du wirklich alle Laufwerke mit einbeziehen willst, dann musst du das über ![]() ![]() Anders kann ich mir nicht vorstellen, dass es geht, hier mal ein Beispiel mit Findfirst/-next:
Delphi-Quellcode:
Aber wie gesagt, es braucht schon einige Zeit zum Suchen.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Controls, Graphics, Forms, StdCtrls, ShellAPI; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } //Programm (xxx.exe) finden: procedure FindAllFiles(RootFolder: string; Mask: string = 'xxx.exe'; Recurse: Boolean = True); //Partitionen ermitteln: procedure LaufwerkeErmitteln; public { Public-Deklarationen } end; var Form1: TForm1; Abbruch: boolean; //Zum Abbrechen des Suchvorgangs Laufwerke: TStringList; //Liste mit den Partitionen ProgrammPfad: string; //selbsterklärend: Programmpfad halt implementation {$R *.dfm} //Alle Partitionen der Festplatte ermitteln, bzw. 2. Festplatten: //============================================================================== procedure TForm1.LaufwerkeErmitteln; var Drive: Char; Str: String; begin for Drive := 'A' to 'Z' do //alle möglichen Buchstaben durchtesten begin Str := ''; case GetDriveType(PChar(Drive + ':\')) of DRIVE_FIXED: //Nur Festplatten anzeigen Str := Drive + ':\'; end; if Str <> '' then Laufwerke.Add(Str); //Partition zur Stringlist (Laufwerke) hinzufügen end; end; //Alle Partitionen der Festplatte ermitteln, bzw. 2. Festplatten: //============================================================================== procedure TForm1.FormCreate(Sender: TObject); begin Laufwerke := TStringList.Create; //in dieser werden die Partitionen gespeichert LaufwerkeErmitteln; //Partitionen herausfinden end; //Das Programm auf der Festplatte finden (adress.exe): //============================================================================== procedure TForm1.FindAllFiles(RootFolder: string; Mask: string = 'xxx.exe'; Recurse: Boolean = True); var SR: TSearchRec; begin //Rootfolder: Pfad //SR.Name: Dateiname (xxx.exe) if AnsiLastChar(RootFolder)^ <> '\' then RootFolder := RootFolder + '\'; if Recurse then begin if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then begin try repeat if SR.Attr and faDirectory = faDirectory then if (SR.Name <> '.') and (SR.Name <> '..') then begin FindAllFiles(RootFolder + SR.Name, Mask, Recurse); end; until (FindNext(SR) <> 0) or (Abbruch); finally FindClose(SR); end; end; if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then begin try repeat if SR.Attr and faDirectory <> faDirectory then begin Application.ProcessMessages; ProgrammPfad := RootFolder + SR.name; if ProgrammPfad <> '' then abbruch := true; //Falls Programm gefunden, aus der procedure raus gehen end; until (FindNext(SR) <> 0) or (Abbruch); finally FindClose(SR); end; end; end; end; //Suche starten und Programm "xxx.exe" öffnen: //============================================================================== procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin //für alle Partitionen wiederholen: for i := 0 to Laufwerke.Count - 1 do FindAllFiles(Laufwerke[i]); //Programm starten ShellExecute(Form1.Handle, 'open', PChar(ProgrammPfad), nil, nil, SW_SHOW); end; //Speicher der Stringlist wieder freigeben: //============================================================================== procedure TForm1.FormDestroy(Sender: TObject); begin Laufwerke.Free; end; end. Edit: Tags vervollständigt. Edit2: kleinere Tippfehlerchen korrigiert. |
Re: ShellExecute ohne genauen Pfad?
Also mit der Sache mit den Ordnern: Reicht es also, wenn man aus Suchpfad den Ordnernamen und dann Dateinamen eingibt?
Und wie ist es, wenn ich das Laufwerk schon kenne, die Datei und den Ordner, in der die Datei ist, auch wenn man über mehrere Ordner "hinweg" die Datei finden muss? Beispiel: Ich weiß, die Datei befindet sich in Laufwerk D. Und ich weiß, die Datei heißt Test.exe und ist im Ordner Test. Doch, um zum Ordner Test zu gelangen muss man noch in die Ordner Delphi und den Ordner Programme, von denen ich jedoch nichts weiß. Wie kann ich dann das Programm finden? Etwa nur mit Findfirst und Findnext? |
Re: ShellExecute ohne genauen Pfad?
*push* ^ bitte Frage beantworten, danke. :gruebel:
|
Re: ShellExecute ohne genauen Pfad?
Zitat:
Es ist ganz einfach. Befindet sich die Datei nicht im Such, dann muss der gesante Pfad zu der Datei bekannt sein und angegeben werden. |
Re: ShellExecute ohne genauen Pfad?
Zitat:
Zitat:
|
Re: ShellExecute ohne genauen Pfad?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz