Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mein guter Freund Mr. ShellExecute (https://www.delphipraxis.net/143517-mein-guter-freund-mr-shellexecute.html)

alphanumeric 17. Nov 2009 15:19


Mein guter Freund Mr. ShellExecute
 
Hallo zusammen,

Ich häng seit ca ner halben stunde im Internet rum und such danach wie ich mithilfe von ShellExecute eine Datei in einem bestimmten Programm öffne. Geht hierbei um ne PDF, die nicht im standardprogramm alias Acrobat sondern im PDF Xchange-Viewer geöffnet werden soll.

das ganze hab ich so begonnen:


Delphi-Quellcode:
    ShellExecute(Application.Handle, 'open', PWideChar(_installpath+'PDFXCview.exe'),PWideChar(_installpath+'Report.pdf') , nil, SW_NORMAL);
_installpath wird aus der registery rausgezogen und die dateinamen werden halt noch angehangen, wie bring ich den jetz dazu, dass der mir meinen Report.pdf mit PDFXCview.exe startet?



Gruß
alphanum

DeddyH 17. Nov 2009 15:21

Re: Mein guter Freund Mr. ShellExecute
 
Eigentlich sieht der Aufruf in Ordnung aus. Was passiert denn? Gar nichts oder wird die PDF doch mit Adobe gestartet?

Tyrael Y. 17. Nov 2009 15:24

Re: Mein guter Freund Mr. ShellExecute
 
Liegt die PDFXCview.exe und Report.pdf wirklich im _installpath?

alphanumeric 17. Nov 2009 15:25

Re: Mein guter Freund Mr. ShellExecute
 
Der Xchange viewer startet, allerdings ohne die datei

Jo die Dateien liegen beide wirklich drin. wie gesagt, programm startet, aber report wird ned gestartet.

DeddyH 17. Nov 2009 15:28

Re: Mein guter Freund Mr. ShellExecute
 
Vielleicht erwartet der Xchange viewer den Parameter in einem bestimmten Format. Klappt es, wenn Du den Befehl über Start-Ausführen absetzt?

[edit] Oder wenn Du den gesamten Parameter einmal in Anführungszeichen einschließt, falls Deine Variable Leerzeichen enthält? [/edit]

Neutral General 17. Nov 2009 15:30

Re: Mein guter Freund Mr. ShellExecute
 
oder falls Leerzeichen im Pfad sind empfehle ich:

Delphi-Quellcode:
ShellExecute(Application.Handle, 'open', PWideChar(_installpath+'PDFXCview.exe'),PWideChar('"'+_installpath+'Report.pdf"') , nil, SW_NORMAL);
Roter Kaste aka DeddyH: :twisted:

DeddyH 17. Nov 2009 15:32

Re: Mein guter Freund Mr. ShellExecute
 
:tongue: :lol:

alphanumeric 17. Nov 2009 15:33

Re: Mein guter Freund Mr. ShellExecute
 
die leerzeichen warens, nun funktioniert es, vielen dank! :)

himitsu 17. Nov 2009 15:54

Re: Mein guter Freund Mr. ShellExecute
 
ShellExecute + PWideChar :?:

Laß diesen Code mal durch einen "älteren" (nicht Unicode) Compiler laufen!

entweder
ShellExecuteW + PWideChar
ShellExecuteA + PAnsiChar

oder
ShellExecute + PChar


Genau durch solche "Schlampereien" hat man bei späteren Umstellungen, innerhalb des Compilers, enorme Probleme.

alphanumeric 17. Nov 2009 21:45

Re: Mein guter Freund Mr. ShellExecute
 
ich hab die kisten so umgewandelt weil der mir in den parametern nen pwidechar verlangt hat - geht das dann auch als pchar? wenn ja, werd ich das morgen auf arbeit gleich korrigieren, danke :)

himitsu 17. Nov 2009 23:59

Re: Mein guter Freund Mr. ShellExecute
 
Klar will ShellExecute bei DIR einen PWideChar, da

Delphi 2009/2010: ShellExecute = ShellExecuteW und das will PWideChar | PChar = PWideChar
"älteres" Delphi: ShellExecute = ShellExecuteA und das will PAnsiChar | PChar = PAnsiChar

Wenn man jetzt das veränderliche ShellExecute mit dem festen PWideChar mischt, dann kann es zu Problemen kommen.
z.B. in Delphi 2007 und älter will ShellExecute einen PChar aka PAnsiChar, wärend in deinem Code PWideChar fest vorgegeben ist.
Und irgendwann kommt UCS4, wo dann ShellExecute das 4-Byte-Unicode will, wärend PWideChar nur ein 2-Byte-Unicode liefert

Also NIEMALS derartige Sachen mischen
Code:
[color=silver]Api[/color] - Char    - String                  - CharArray    - PChar
[color=silver]Api[/color]A - AnsiChar - AnsiString              - AnsiCharArray - PAnsiChar
[color=silver]Api[/color]W - WideChar - WideString/UnicodeString - WideCharArray - PWideChar
Einzig und alleine bei Char und String wäre eine Vermischung möglich, da Delphis CompilerMagic dort eine automatische Typumwandlung implementiert hat, aber auch da "meckert" der Compiler und warnt vor eventuellen Datenverlusten, Aufgrund "unkontrollierter" Umwandlungen.


Wenn Daten nicht Bytegenau und Typsicher gespeichert oder übertagen werden sollen, dann einfach die 1. Variante (mit String und Co.) verwenden, da sie sich an den genutzen Compiler und seine Standardfunktionen anpaßt.
Ansonsten sollte man es genau definieren, damit z.B. bei Compiler/IDE-Upgrade sich nichts verändert.

> Char String PChar Integer Cardinal Pointer und die APIs ohne A/W sind dieser Veränderlichen

Luckie 18. Nov 2009 09:02

Re: Mein guter Freund Mr. ShellExecute
 
Das hat Microsoft besser gelöst. Wenn ich dort in einem Programm ShellExecute benutze, wird je nach Kompilereinstellungen ShellExecuteA oder ShellExecuteW benutzt. Wenn ich dann noch das Makro _T (oder so) benutze, dann werden auch die zeichenketten passend konvertiert.


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