AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ShellExecute ohne genauen Pfad?

Ein Thema von malo · begonnen am 19. Okt 2004 · letzter Beitrag vom 4. Nov 2005
Antwort Antwort
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#1

ShellExecute ohne genauen Pfad?

  Alt 19. Okt 2004, 17:34
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? ^^
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: ShellExecute ohne genauen Pfad?

  Alt 19. Okt 2004, 18:09
ShellExecute findet alle Programme im Pfad. "Notepad.exe" funktioniert also.
Wenn man es mit einem Dateinamen aufruft, so findet es das zugewiesene Programm.
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#3

Re: ShellExecute ohne genauen Pfad?

  Alt 19. Okt 2004, 19:43
Notepad.exe kann man ja auch einfach starten, aber bei jedem anderen Programm, das ich ausprobiert hab, nicht

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?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: ShellExecute ohne genauen Pfad?

  Alt 20. Okt 2004, 06:28
Es gilt der Suchpfad, also aktuelles Verzeichnis, dann die Verzeichnisse der PATH-Umgebungsvariablen und dann das Windows-Verzeichnis.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: ShellExecute ohne genauen Pfad?

  Alt 20. Okt 2004, 07:01
Zitat von malo:
Was ist übrigens bei den Programmen, deren Name mehrfach auf einer Festplatte vertreten sind?
ShellExecute muss den Namen des Ordners kennen, sonst geht es nicht und pro Ordner ist der Dateiname einzigartig.

Wenn du wirklich alle Laufwerke mit einbeziehen willst, dann musst du das über Hier im Forum suchenFindfirst Hier im Forum suchenFindnext realisieren, was aber Zeit in Anspruch nimmt, bis die Datei gefunden wurde.
Anders kann ich mir nicht vorstellen, dass es geht, hier mal ein Beispiel mit Findfirst/-next:

Delphi-Quellcode:
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 := 'Ato 'Zdo //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.
Aber wie gesagt, es braucht schon einige Zeit zum Suchen.


Edit: Tags vervollständigt.
Edit2: kleinere Tippfehlerchen korrigiert.
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#6

Re: ShellExecute ohne genauen Pfad?

  Alt 20. Okt 2004, 12:00
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?
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#7

Re: ShellExecute ohne genauen Pfad?

  Alt 21. Okt 2004, 11:09
*push* ^ bitte Frage beantworten, danke.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: ShellExecute ohne genauen Pfad?

  Alt 21. Okt 2004, 11:32
Zitat von malo:
*push* ^ bitte Frage beantworten, danke.
Ich wußte gar nicht, dass ich mich mit meiner Anmeldung hier dazu verpflichtet habe zu antworten?

Es ist ganz einfach. Befindet sich die Datei nicht im Such, dann muss der gesante Pfad zu der Datei bekannt sein und angegeben werden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#9

Re: ShellExecute ohne genauen Pfad?

  Alt 21. Okt 2004, 11:36
Zitat von Luckie:
Zitat von malo:
*push* ^ bitte Frage beantworten, danke.
Ich wußte gar nicht, dass ich mich mit meiner Anmeldung hier dazu verpflichtet habe zu antworten?
Bist du auch nicht, es war ja nur 'ne Bitte

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.
Also gibt es keine Möglichkeit? Hilft mir nicht unbedingt weiter, aber danke...
  Mit Zitat antworten Zitat
Aike

Registriert seit: 2. Okt 2004
319 Beiträge
 
#10

Re: ShellExecute ohne genauen Pfad?

  Alt 4. Nov 2005, 16:29
Ein Jahr später:
Ich würde mal bei den Schweizern nachschlagen. Wenn man nach "Verzeichnisse" sucht, kommen einige Ergebnisse, z.B.
- Link 1
- Link 2

Beste Grüße
Aike
Achim
  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 05:38 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