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 und Word (https://www.delphipraxis.net/211843-shellexecute-und-word.html)

wurzelsepp1 9. Nov 2022 20:51

Shellexecute und Word
 
Moin Gemeinde,

mal wieder eine einfache Frage:

Ich möchte ein Word-Dokument mit Word öffnen und verwende dazu Shellexecute.

Rufe ich die Funktion mit Pfad- und Dateiangabe auf, funktioniert alles. Beim Aufruf mit einer Variablen, die den selben Pfad enthält bekomme ich einen Code 2 zurück.


Beispiel hardcoded = funktioniert:

Delphi-Quellcode:
iReturnVal := ShellExecute(0, nil, 'C:\Users\jupp\Office-Dokumente\Serienbrief-Vorlage.dotx', nil, nil, 0);


Beispiel mit Variable = funktioniert nicht:
Delphi-Quellcode:
  getmem(pDatei, 256);
  sDatei := DateiscEdit.Text;
  pDatei := StringToWideChar(sDatei, pDatei, 256);

  iReturnVal := ShellExecute(0, 'open', pDatei, nil, nil, 0);
Das gleiche Konstrukt mit mailto funktioniert übrigens ..

Was mache ich da falsch?

Danke & schönen Abend,
alex

Dalai 9. Nov 2022 21:20

AW: Shellexecute und Word
 
Wir wissen nicht, wie pDatei definiert ist, und wir wissen auch nicht, ob in sDatei letztlich wirklich derselbe absolute Pfad drinsteht.

Aber es geht viel einfacher, und ohne viel Klimbim drumherum:
Delphi-Quellcode:
iReturnVal:= ShellExecute(0, 'open', PChar(sDatei), nil, nil, 0);
{oder auch}
iReturnVal:= ShellExecute(0, 'open', PChar(DateiscEdit.Text), nil, nil, 0);
Das Verb kann übrigens auch einen Unterschied machen, auch 'open' statt nil (wenn auch selten).

Grüße
Dalai

himitsu 9. Nov 2022 21:20

AW: Shellexecute und Word
 
Erstmal 2 = ERROR_FILE_NOT_FOUND bzw. SE_ERR_FNF

und steht im Edit wirklich genau das Gleiche, wie vorher in der Konstante?


Zitat:

Zitat von wurzelsepp1 (Beitrag 1514553)
Beim Aufruf mit einer Variablen, die den selben Pfad

Dann hast du nicht nur die diesen einen Parameter getauscht.

das ist nicht das Selbe
Delphi-Quellcode:
  iReturnVal := ShellExecute(0, nil, ..., nil, nil, 0);

  iReturnVal := ShellExecute(0, 'open', ..., nil, nil, 0);
Delphi-Quellcode:
  getmem(pDatei, 256); <<<< 256 Bytes

  pDatei := StringToWideChar(sDatei, pDatei, 256); <<< 256 Chars
Delphi-Quellcode:
getmem(pDatei, 256 * SizeOf(Char));

ähhh
Delphi-Quellcode:
getmem(pDatei, MAX_PATH * SizeOf(Char));

nja
Delphi-Quellcode:
getmem(pDatei, (Length(sDatei) + 1) * SizeOf(Char));


Aber erstmal sind statische Buffer saublöd, (statisch = sich nicht an den Inhalt anpassend, vor allem wenn es zu klein sein könnte)
vor allem, da Microsoft seit Jahren versucht solchen Mist loszuwerden
https://learn.microsoft.com/de-de/wi...?tabs=registry

und irgendwelche Zahlen anstatt Konstanten sind noch unschöner.



Was sagt denn der Debugger,
zum Inhalt von pDatei?

Welche Delphi-Version?

Wenn nicht D2009 oder älter, dann selbst Schuld, wenn jemand (du) die Compilerwarnungen nicht liest.
https://www.delphipraxis.net/profile...le#csel_field5



Aber eignentlich würde ich eher solch unnützes Rumkopieren einfach lassen.
Delphi-Quellcode:
  iReturnVal := ShellExecute(0, nil, PChar(sDatei), nil, nil, 0);

  iReturnVal := ShellExecute(0, nil, PChar(DateiscEdit.Text), nil, nil, 0);

wurzelsepp1 10. Nov 2022 13:14

AW: Shellexecute und Word
 
Zitat:

Zitat von Dalai (Beitrag 1514554)
Aber es geht viel einfacher, und ohne viel Klimbim drumherum:
Delphi-Quellcode:
iReturnVal:= ShellExecute(0, 'open', PChar(sDatei), nil, nil, 0);
{oder auch}
iReturnVal:= ShellExecute(0, 'open', PChar(DateiscEdit.Text), nil, nil, 0);

Moin Dalai,

das war die Lösung: Mit PChar als Parameter läuft's. :)

Aber, für den Lerneffekt: Warum findet ShellExecute die Datei nicht, wenn ich die Stringumwandlung mit StringToWideChar mache?


VG
Alex

himitsu 10. Nov 2022 13:24

AW: Shellexecute und Word
 
Zitat:

Zitat von wurzelsepp1 (Beitrag 1514601)
Warum findet ShellExecute die Datei nicht, ...

Man könnte die Fragen beantworten?
Vielleicht kommt dabei die (Er)Lösung.
Zitat:

Zitat von himitsu (Beitrag 1514555)
Was sagt denn der Debugger,
zum Inhalt von pDatei?

Welche Delphi-Version?



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