Entwickler-Ecke

Dateizugriff - GetCurrentDir in ShellExecute


chris_davidi - Di 09.09.03 12:51
Titel: GetCurrentDir in ShellExecute
Warum funktioniert das nicht. Kann mir jemand helfen? Es geht mir in diesem Fall um die GetCurrentDir Funktion. Direkter Pfad klappt, aber dies nicht, habe schon vieles probiert...


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 ShellExecute(Application.Handle, 'open',  'getcurrentdir\transfer.bat', nil, nil, SW_SHOW);
end;


Danke im Voraus. :)


Delete - Di 09.09.03 13:05

Vielleicht weil "GetCurrentDir" der Name einer Funktion ist, in deinem Beispiel aber als String (und damit als Verzeichnisname) miss-interpretiert wird?

Darüber hinaus kann "GetCurrentDir" in die Hose gehen, weil das aktuelle Verzeichnis (= ermittelt mit der Funktion) nicht mit dem Ordner identisch sein muss, in dem sich die Batchdatei befindet. Liegt diese BAT-Datei zufällig im Ordner deines Programms, das den gezeigten ShellExecute-Befehl benutzt? Dann mach dich mal bitte über Suche in: Delphi-Forum, Delphi-Library EXTRACTFILEPATH schlau.

Gruß.


chris_davidi - Do 11.09.03 08:55

Hi...

Ich bekomme ExtractFile Pfad so angewendet, dass ich es verschieden einsetzen kann, jedoch kann ich den Pfad, welchen ich damit festgelegt habe nicht als Variable in ShellExecute einbinden.

Kannst du mir ein Beispiel geben, wie du es machen würdest?


Delete - Do 11.09.03 09:06

chris_davidi hat folgendes geschrieben:
Ich bekomme ExtractFile Pfad so angewendet, dass ich es verschieden einsetzen kann,

Muß ich diesen Teilsatz verstehen? :roll:
Zitat:

jedoch kann ich den Pfad, welchen ich damit festgelegt habe nicht als Variable in ShellExecute einbinden.

Warum nicht? Falls Delphi eien Fehlermeldung ausspuckt, verrat sie uns ja nur nicht, könnte ja helfen dein Problem zu lösen.


JustusJonas - Do 11.09.03 09:31

Versuch's einfach mit ExtractFilePath oder ExtractFileDir und schreibe das dann in eine Variable. Am Ende musst du im ShellExecute nur noch die beiden Strings zusammenführen!

Wenn du eine Batch starten möchtest, die eh im selben Verzeichnis steht, musst du nur den Dateinamen angeben, sonst nichts!

Greetz


Delete - Do 11.09.03 09:59

Ich hab egerade meine Glaskugel beschwört. ShellExecute mag den String wohl nicht. Caste in mal zu einem PChar oder zu einen Zeiger auf einen String.


chris_davidi - Do 11.09.03 10:14

Sorry, habe mich komisch ausgedrückt.

Also, ich habe mit ExtractPfad ein Verzeichniss bestimmt. Dieses ist als CurrentDir festgelegt. Ich kann zum Beispiel bei der Komponente ZIP-Master das CurrentDir einbinden und es funktioniert.

Bei ShellExecute kann ich es einbinden, jedoch funktioniert nichts. Es kommt kein Fehler von Delphi, aber es wird nicht gefunden. Kann es also sein, dass dies allgemein nicht funktioniert, sprich, dass man in ShellExecute nur direkte Angaben zum Verzeichnis (C:\Test) machen muss und dies also nicht durch eine Varibale wie CurrentDir, welche man vorher per ExtractPfad festgelegt hat bestimmen?


Delete - Do 11.09.03 10:16

Sicher geht das. Zeig mal Code.


chris_davidi - Do 11.09.03 12:08


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.SpeedButton1Click(Sender: TObject); 
var
 CurrentDir: String; 
begin 
 CurrentDir := ExtractFilePath('C:\test'); 
 ShellExecute(Application.Handle, 'open',  '+ CurrentDir\transfer.bat', nil, nil, SW_SHOW); 
end;


Delete - Do 11.09.03 12:17

Autsch. Paß auf, dass dich keiner wegen Körperverletzung anzeigt. :mrgreen:

Strings konkateniert man mit dem Plus-Operator:

Delphi-Quelltext
1:
2:
3:
4:
var
  s, t: String;
begin
  s := t + 'Hello world';


JustusJonas - Do 11.09.03 14:12

Würde bei dir dann so aussehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.SpeedButton1Click(Sender: TObject);  
var 
 CurrentDir: String;  
begin  
 CurrentDir := ExtractFilePath('C:\test');  
 ShellExecute(Application.Handle, 'open',  CurrentDir + '\transfer.bat', nil, nil, SW_SHOW);  
end;


Aber irgendwie verstehe ich das nicht so ganz! In der DelphiHilfe steht zu ExtractFilePath folgendes:
Zitat:
ExtractFilePath extrahiert die Laufwerks- und Verzeichnisinformationen aus einem Dateinamen.


Wenn du eh nur "C:\Test" an ExtractFilePath übergibst, wieso schreibst du das dann nicht gleich in die ShellExecute????

Greetz


chris_davidi - Do 11.09.03 14:16

Ich schreibe es nicht in ShellExecute, weil ich später auch noch andere Programme starten will... Sonst müsste ich es bei 10 zu startende Programme 10 mal den Pfad ändern, so nur die Variabe... Das mit einmal ShellExecute ist nur als Beispiel gedacht...


Popov - Do 11.09.03 15:36

Versuch es mal so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.SpeedButton1Click(Sender: TObject);   
var  
 CurrentDir: String;   
begin   
 CurrentDir := ExtractFilePath('C:\test\test.txt');   
 ShellExecute(Application.Handle, 'open',  PChar(CurrentDir + 'transfer.bat'), nil, nil, SW_SHOW);   
end;


Das PChar ist sehr wichtig. ShellExecute (und auch andere API Funktionen) benötigen in der Regel einen nullterminierten String. Mit einem normalen Szting können die nichts anfangen. Also immer mit PChar konvertieren.

Wobei ExtractFilePath immer den Pfad mit einem Backslash zurückliefert. ExtractFileDir gibt den Pfad ohne Backslash.

Wenn du aber nicht weißt ob der Backslash bereits vorhanden ist oder nicht, dann kannst du es so prüfen und, wenn kein vorhanden, einfügen:


Delphi-Quelltext
1:
if CurrentDir[Length(CurrentDir)] <> '\' then CurrentDir := CurrentDir + '\';                    


Und gewöhn dir an den Backslash nur an einer Stelle anzufügen, d.h. nicht vor einen FileName, sondern immer hinter einen Pfad. Ein Backslash gehört immer zu dem Pfad und nicht zu dem Dateinamen. Der Dateiname enthällt immer nur den Namen der Datei. Wenn du es nicht so machst, dann weißt du irgendwann nicht mehr wo der Backslash zu finden ist und baust eventuell zwei ein. Das könnte dann so aussehen:

C:\test\\test.txt