Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ShellExecute(); (https://www.delphipraxis.net/95641-shellexecute-%3B.html)

passsy 10. Jul 2007 20:49


ShellExecute();
 
ich will eine *.bat ausführen das problem ist aber das ich keinen pfad eingeben kann da das programm auf meinem usb stick laufen soll und somit sich der laufwerksbuchstabe je nach dem ändert. die *.bat befindet sich allerdings in einem unterordner.

wie kann ich das den machen?

fLaSh11 10. Jul 2007 20:58

Re: ShellExecute();
 
Delphi-Quellcode:
ShellExecute(self.Handle,'open',PChar(ExtractFilePath(ParamStr(0))+'unterordner\xxx.bat'),nil,nil,0);
ExtractFilePath(ParamStr(0)) -> extrahiert den Pfad der Exe

//Edit: Siehe Slash-Einwand

scrat1979 10. Jul 2007 21:36

Re: ShellExecute();
 
Zitat:

Zitat von fLaSh11
Delphi-Quellcode:
ShellExecute(self.Handle,'open',PChar(ExtractFilePath(ParamStr(0))+'unterordner/xxx.bat'),nil,nil,0);
ExtractFilePath(ParamStr(0)) -> extrahiert den Pfad der Exe

Dazu 2 Fragen / Anregungen:

1. Müsste statt einem "/" nicht ein "\" stehen? Weiß nicht, ob es unter Win auch geht.... :gruebel:

2. IMHO wird kein abschließendes "\" nach ExtractFilePath eingefügt. Das müsste man dann entweder manuell machen (falls Programm in einem Unterorder ist) oder das ganze mittels IncludeTrailingPathDelimiter "automatisch" erledigen. Tip: Vor dem ausführen einfach mal die ganze Befehlszeile mittels ShowMessage anzeigen und ggf. noch etwas herumhantieren :-)

SCRaT

fLaSh11 10. Jul 2007 21:39

Re: ShellExecute();
 
"..." gibt das Arbeitsverzeichnis von Windows an, wenn mich nicht alles täuscht, d.h. es kann zu Fehlern führen, wenn man auch andere Applikationen ausführt?!

//Edit: Der Querbalken... haste recht^^

SirThornberry 10. Jul 2007 21:41

Re: ShellExecute();
 
die 3 punkte waren ein Platzhalter und es ging um den Backslash. Ob man Slash oder BackSlash verwendet ist in den mir bisher untergekommenen Fällen egal.
@scrat1979: Doch, ExtractFilePath lässt den abschließenden Backslash

mkinzler 10. Jul 2007 21:41

Re: ShellExecute();
 
Für das Arbeitsverzeichnis brauchst du gar nichts angeben. aber ich glaube er gat ... als Platzhalter verwendet.

fLaSh11 10. Jul 2007 21:45

Re: ShellExecute();
 
Recht haste... kann es aber sein, dass "...\" bei C++ ein bestimmtes Verzeichnis angibt? (Irgendwie ist da was in meinem Hinterstübchen :stupid: )

DeddyH 10. Jul 2007 21:47

Re: ShellExecute();
 
\ ist das Wurzelverzeichnis des Arbeitsverzeichnisses. In C/C++ wird dieses außerdem als Escape-Zeichen für Steuersequenzen benutzt. Das hat aber mit Pfadangaben nix zu tun.

passsy 11. Jul 2007 08:56

Re: ShellExecute();
 
echt super den pfad zeigts mir mit ner showmessage richtig an leider passiert mit der *.bat gar nix :(

ideen worans liegen könnte?


ok ma was anderes ich bin auch doof kann ich mir shellexecute nich auch gleich parameter rein machen?

die *.bat
Delphi-Quellcode:
TrueCrypt.exe /lz /q /a /c n /m rm /v pwgeschuetzerstick
action=Mount TrueCrypt Volume
daraus kann man doch n prog schreiben, oder?

DeddyH 11. Jul 2007 09:11

Re: ShellExecute();
 
Batch-Dateien kannst Du nicht direkt per ShellExecute ausführen, sondern nur über den Kommandointerpreter mit der Batch als Parameter.

mkinzler 11. Jul 2007 09:24

Re: ShellExecute();
 
In diesem Fall brauchst du ja aber kein Batchdatei sondern kannst den Befehl direkt im ShellExecute aufrufen. Hat auch den Vorteil das das Passwort usw. nicht aus der Batchdatei gelesen werden kann.

Relicted 11. Jul 2007 09:26

Re: ShellExecute();
 
natürlich kann man batch dateien direkt aufrufen...

Delphi-Quellcode:
s := ExtractFilePath( Application.ExeName );
coFile.SaveToFile( s + 'update.bat' );
ShellExecute(0, nil, PChar(s+'update'), nil, nil, SW_SHOWNORMAL);
funktioniert einwandfrei, darfst nur beim shellexecute keine dateiendung angeben :-) ...

gruß
reli

DeddyH 11. Jul 2007 09:31

Re: ShellExecute();
 
Dann gibt es noch eine update.com und eine update.exe im selben Verzeichnis und Schluss war' s mit bat :-D

Relicted 11. Jul 2007 09:33

Re: ShellExecute();
 
ja das ist klar... aber wenn es den dateinamen nur einmal gibt dann geht das auch mit dem aufrufen... notfalls gibt man der batch nen namen der total sinnfrei ist ( sinnfrei.bat ist auch schön.. ) da man die datei sicher auch nur tempörär braucht... also möglich ist es aber ob es elegant ist ist ne andere frage ganz klar.

gruß
reli

passsy 11. Jul 2007 10:22

Re: ShellExecute();
 
was zur hölle ist den cofile.* ???

DeddyH 11. Jul 2007 10:25

Re: ShellExecute();
 
Scheint sich um eine Stringliste zu handeln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 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