![]() |
Ich liebe ShellExecute
Moin Moin.
Wenn ich zu Fuß via Console eingebe:
Code:
macht er genau das was er soll: entpacken der 7z Datei.
C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST>7z.exe x aaaaaa.7z
In meinem Wahn setze ich das dann um in eine ShellExecute Anweisung.
Delphi-Quellcode:
Returncode ist 42, angeblich ja alles primstens, ErrorCode ist 0, Ergebnis ist : Nichts. Das Archiv wird nicht entpackt.
begin
WorkFile := '"' + PrgPath + 'Test\7z.exe"'; Params := '" x AAAAAA.7z"'; ReturnCode := ShellExecute(0, 'open', PChar(Workfile),Pchar(Params), nil, SW_shownormal); Error := GetLastError; end; Meine Frage: Wen erschiesse ich zu erst : den Computer oder mich? creehawk |
AW: Ich liebe ShellExecute
Sind die Gänsefüßchen (") bei Params evtl. das Problem?
|
AW: Ich liebe ShellExecute
Nein, leider nicht. Ob mit oder ohne . geht nicht.
creehawk |
AW: Ich liebe ShellExecute
Was genau steht denn in PrgPath?
|
AW: Ich liebe ShellExecute
Naja, dies hier:
Code:
Hole ich zur Laufzeit über :
C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\
Delphi-Quellcode:
PRGPath := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
creehawk |
AW: Ich liebe ShellExecute
Gib mal einen vollen Pfad zur AAAAAA.7z an. Evtl. sucht er die ganz woanders.
|
AW: Ich liebe ShellExecute
Delphi-Quellcode:
Und immer noch nix.
begin
WorkFile := 'C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST\7z.exe'; Params := 'x C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST\AAAAAA.zip'; ReturnCode := ShellExecute(0, 'open', PChar(Workfile),Pchar(Params), nil, SW_shownormal); Error := GetLastError; showmessage(ReturnCode.tostring); showmessage(Error.tostring); end; creehawk |
AW: Ich liebe ShellExecute
Das verb "open" halte ich für falsch bei einer .exe-Datei. Versuch doch mal NULL/nil
![]() |
AW: Ich liebe ShellExecute
Und immer noch nix. Ob Nil oder Null.
Ich habe in anderen Programmen diese Form des Aufrufs verwendet. Funktionierte anstandslos. Und die 42 als Antwort fasse ich als OK auf. Sehr rätselhaft. creehawk |
AW: Ich liebe ShellExecute
Wenn du das per Kommandozeile startest, bist du dann in dem TEST Verzeichnis? (immerhin wird die 7z-Datei ja dort ohne Pfad angegeben)
Dann wäre die Pfadangabe bei der EXE aber redundant. Bei ShellExecute ist das aktuelle Verzeichnis aber vermutlich ein anderes sein, weswegen dort die Pfade hilfreich sind. Ich habe da ja die Leerzeichen in Verdacht. Vielleicht probierst du es mal in einem Pfad ohne diese. Für den aktuellen Fall käme noch folgender Ansatz mit Quotes in Betracht:
Delphi-Quellcode:
WorkFile := '"C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST\7z.exe"';
Params := 'x "C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST\AAAAAA.zip"'; |
AW: Ich liebe ShellExecute
Ich habe es mal bei mir getestet.
Bei mir wird entpackt, alle fein.
Delphi-Quellcode:
Frank
procedure TForm8.Button1Click(Sender: TObject);
Var ReturnCode: Integer; WorkFile: string; Params: string; Error: Integer; s: string; begin WorkFile := '"c:\Program Files\7-Zip\7z.exe"'; Params := 'x "d:\Buffer\Test 7z\Test.7z"'; s := WorkFile + ' ' + Params; // s = "c:\Program Files\7-Zip\7z.exe" x "d:\Buffer\Test 7z\Test.7z" ReturnCode := ShellExecute(0, 'open', PChar(Workfile),Pchar(Params), nil, SW_shownormal); Error := GetLastError; end; |
AW: Ich liebe ShellExecute
Schon einmal
Delphi-Quellcode:
probiert?
Workdir := ExtractFilepath(Workfile);
ShellExecute(0, 'open', PChar(Workfile),Pchar(Params), PChar(Workdir), SW_shownormal); |
AW: Ich liebe ShellExecute
Du musst ShellExecute das Arbeitsverzeichnis mitteilen ;-)
...:cat:... |
AW: Ich liebe ShellExecute
Siehe den Post über Deinem ;-)
|
AW: Ich liebe ShellExecute
@Uwe Raabe
Zitat : 'Bei ShellExecute ist das aktuelle Verzeichnis aber vermutlich ein anderes........' Also: Das funktioniert:
Delphi-Quellcode:
Das funktioniert:
ChDir('C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST');
WorkFile := '"C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST\7z.exe"'; Params := 'x "C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST\Villa.zip"'; ReturnCode := ShellExecute(Application.Handle,'open', PChar(Workfile),Pchar(Params),Nil, SW_shownormal);
Delphi-Quellcode:
Das funktioniert NICHT.
ChDir('C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST');
WorkFile := '"7z.exe"'; Params := 'x "Villa.zip"'; ReturnCode := ShellExecute(Application.Handle,'open', PChar(Workfile),Pchar(Params),Nil, SW_shownormal);
Delphi-Quellcode:
Das Verzeichnis mit chDir zu verlegen ist offensichtlich notwendig. Aber warum? Habe ich bisher im Zusammenhang mit ShellExceute nicht gebraucht. Fordert das die 7z.exe an?
WorkFile := '"C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST\7z.exe"';
Params := 'x "C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST\Villa.zip"'; ReturnCode := ShellExecute(Application.Handle,'open', PChar(Workfile),Pchar(Params),Nil, SW_shownormal); Jedenfalls danke ich allen für die Antworten und die Hilfe.:) creehawk Und da fällt mir noch was auf: das x für extract steht ausserhalb der Quotes der zip Datei. Das muss ventiliert werden. |
AW: Ich liebe ShellExecute
Schau Dir den vorletzten Parameter von ShellExecute noch einmal an.
|
AW: Ich liebe ShellExecute
Meine Version noch mal mit Output Directory:
Delphi-Quellcode:
Wenn es das Problem ist. Das Workdirectory muss man IMO nicht ändern, kann man aber (siehe DaddyH und Andere).
procedure TForm8.Button1Click(Sender: TObject);
Var ReturnCode: Integer; WorkFile: string; Params: string; Error: Integer; s: string; begin WorkFile := '"c:\Program Files\7-Zip\7z.exe"'; Params := 'x -o"d:\Buffer\Test 7z" "d:\Buffer\Test 7z\Test.7z"'; s := WorkFile + ' ' + Params; // s = "c:\Program Files\7-Zip\7z.exe" x -o"d:\Buffer\Test 7z" "d:\Buffer\Test 7z\Test.7z" ReturnCode := ShellExecute(0, 'open', PChar(Workfile),Pchar(Params), nil, SW_shownormal); Error := GetLastError; end; Frank |
AW: Ich liebe ShellExecute
Zitat:
Delphi-Quellcode:
),
-o"C:\irgendwo\"
aber zusätzlich das Arbeitsverzeichnis kann eh nie verkehrt sein, denn 7-Zip erstellt gern mal im Arbeitsverzeichnis Temp-Dateien.
Delphi-Quellcode:
WorkDir := 'd:\Buffer\Test 7z';
..., PChar(Params), PChar(WorkDir), SW_ShowNormal); Und in WorkFile gehören eigentlich keine Anführungszeichen, wenn mit dem zweiten Params-Parameter gearbeitet wird.
Delphi-Quellcode:
oder
{Operation,} CommandLine, nil {, WorkDir}
Delphi-Quellcode:
.
{Operation,} ProgramPath, Parameters {, WorkDir}
|
AW: Ich liebe ShellExecute
himitsu
Denk dran, der Pfad hat ein Leerzeichen... OK, habs gerade bei dir gelesen. Das in WorkDir keine Anführungszeichen benötigt werden, wusste ich nicht... |
AW: Ich liebe ShellExecute
Der Pfad "enthält" aber keine Anführungszeichen.
CommandLine <> Path CommandLine ist so, wie man es in der Console, bzw. Batch angiebt, inkl. der Parameter. Hier sind Leerzeichen = Trennzeichen. Und als Pfad ist es so, wie bei jeder anderen Win32-API auch. Und du gibst doch bei einem CreateFile oder MoveFile auch keine " mit an. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 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