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/)
-   -   Ich liebe ShellExecute (https://www.delphipraxis.net/210614-ich-liebe-shellexecute.html)

creehawk 18. Mai 2022 07:39

Ich liebe ShellExecute
 
Moin Moin.

Wenn ich zu Fuß via Console eingebe:
Code:
C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\TEST>7z.exe x aaaaaa.7z
macht er genau das was er soll: entpacken der 7z Datei.

In meinem Wahn setze ich das dann um in eine ShellExecute Anweisung.
Delphi-Quellcode:
  begin
    WorkFile := '"' + PrgPath + 'Test\7z.exe"';
    Params  := '" x AAAAAA.7z"';
    ReturnCode := ShellExecute(0, 'open', PChar(Workfile),Pchar(Params), nil, SW_shownormal);
    Error := GetLastError;
  end;
Returncode ist 42, angeblich ja alles primstens, ErrorCode ist 0, Ergebnis ist : Nichts. Das Archiv wird nicht entpackt.

Meine Frage: Wen erschiesse ich zu erst : den Computer oder mich?

creehawk

Gausi 18. Mai 2022 07:44

AW: Ich liebe ShellExecute
 
Sind die Gänsefüßchen (") bei Params evtl. das Problem?

creehawk 18. Mai 2022 07:51

AW: Ich liebe ShellExecute
 
Nein, leider nicht. Ob mit oder ohne . geht nicht.

creehawk

Uwe Raabe 18. Mai 2022 08:48

AW: Ich liebe ShellExecute
 
Was genau steht denn in PrgPath?

creehawk 18. Mai 2022 09:09

AW: Ich liebe ShellExecute
 
Naja, dies hier:
Code:
C:\Users\citybuilders\Eigene Projekte\Eigene Projekte Scanner\
Hole ich zur Laufzeit über :

Delphi-Quellcode:
  PRGPath := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));


creehawk

BlueStarHH 18. Mai 2022 09:15

AW: Ich liebe ShellExecute
 
Gib mal einen vollen Pfad zur AAAAAA.7z an. Evtl. sucht er die ganz woanders.

creehawk 18. Mai 2022 09:22

AW: Ich liebe ShellExecute
 
Delphi-Quellcode:
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;
Und immer noch nix.

creehawk

Der schöne Günther 18. Mai 2022 09:24

AW: Ich liebe ShellExecute
 
Das verb "open" halte ich für falsch bei einer .exe-Datei. Versuch doch mal NULL/nil

https://docs.microsoft.com/en-us/win...tew#parameters

creehawk 18. Mai 2022 09:34

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

Uwe Raabe 18. Mai 2022 09:38

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"';

dataspider 18. Mai 2022 10:07

AW: Ich liebe ShellExecute
 
Ich habe es mal bei mir getestet.
Bei mir wird entpackt, alle fein.

Delphi-Quellcode:
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;
Frank

just beginner 18. Mai 2022 10:09

AW: Ich liebe ShellExecute
 
Schon einmal

Delphi-Quellcode:
Workdir := ExtractFilepath(Workfile);
ShellExecute(0, 'open', PChar(Workfile),Pchar(Params), PChar(Workdir), SW_shownormal);
probiert?

sakura 18. Mai 2022 10:15

AW: Ich liebe ShellExecute
 
Du musst ShellExecute das Arbeitsverzeichnis mitteilen ;-)

...:cat:...

DeddyH 18. Mai 2022 10:16

AW: Ich liebe ShellExecute
 
Siehe den Post über Deinem ;-)

creehawk 18. Mai 2022 10:19

AW: Ich liebe ShellExecute
 
@Uwe Raabe
Zitat : 'Bei ShellExecute ist das aktuelle Verzeichnis aber vermutlich ein anderes........' Also:

Das funktioniert:
Delphi-Quellcode:
  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);
Das funktioniert:
Delphi-Quellcode:
  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);
Das funktioniert NICHT.
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\Villa.zip"';
  ReturnCode := ShellExecute(Application.Handle,'open', PChar(Workfile),Pchar(Params),Nil, SW_shownormal);
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?

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.

DeddyH 18. Mai 2022 10:24

AW: Ich liebe ShellExecute
 
Schau Dir den vorletzten Parameter von ShellExecute noch einmal an.

dataspider 18. Mai 2022 10:28

AW: Ich liebe ShellExecute
 
Meine Version noch mal mit Output Directory:

Delphi-Quellcode:
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;
Wenn es das Problem ist. Das Workdirectory muss man IMO nicht ändern, kann man aber (siehe DaddyH und Andere).

Frank

himitsu 18. Mai 2022 11:08

AW: Ich liebe ShellExecute
 
Zitat:

Zitat von sakura (Beitrag 1505988)
Du musst ShellExecute das Arbeitsverzeichnis mitteilen ;-)

Jupp, oder 7-Zip das Ausgabeverzeichnis mitgeben (
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:
{Operation,} CommandLine, nil {, WorkDir}
oder
Delphi-Quellcode:
{Operation,} ProgramPath, Parameters {, WorkDir}
.

dataspider 18. Mai 2022 11:19

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...

himitsu 18. Mai 2022 13:06

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