Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem mit ShellExecute und .pdf Dateien (https://www.delphipraxis.net/178762-problem-mit-shellexecute-und-pdf-dateien.html)

Amateurprofi 25. Jan 2014 17:53

Problem mit ShellExecute und .pdf Dateien
 
Mit
Delphi-Quellcode:
ShellExecute(Handle,'open','Test.pdf',nil,nil,SW_SHOWNORMAL);
will ich die Datei 'Test.pfd' anzeigen lassen.

Das hat früher gut funktioniert, seit einiger Zeit (nachdem ich Nuance PDF Converter installierte) funktioniert das nicht mehr.

Die Datei wird nicht angezeigt, ShellExecute gibt als Resultat SE_ERR_NOASSOC zurück, was besagt "There is no application associated with the given file name extension."

In der Systemsteuerung ist festgelegt, dass .pdf Dateien immer mit dem Adobe Reader geöffnet werden sollen.

In den Datei-Eigenschaften von 'Test.pfd' steht ebenfalls "Öffnen mit Adobe Reader".

Im Windows-Explorer wird bei Doppelklick auf die Datei diese korrekt mit dem Adobe Reader geöffnet.

Probeweise habe ich in der Systemsteuerung festgelegt, dass sie mit Adobe Photoshop Elements 10 geöffnet werden sollen.
Das ShellExecute öffnete dann die Datei mit Photoshop.

Danach habe in der Systemsteuerung wieder Adobe Reader für .pdf Dateien festgelegt.
ShellExecute lieferte dann wieder den Fehlercode SE_ERR_NOASSOC.

Weiß jemand, wie ich das Problem lösen kann?

jaenicke 25. Jan 2014 18:17

AW: Problem mit ShellExecute und .pdf Dateien
 
Da bleibt eigentlich, wie an viele Stellen, nur selbst nachschauen. Sprich Process Monitor anschalten und schauen was nach dem Ausführen von ShellExecute passiert. Da werden Registry-Einträge gelesen usw., und einer davon wird einen unpassenden Wert haben.

Unter HKEY_CLASSES_ROOT einmal die Standardschlüssel für die Dateierweiterung manuell prüfen kann auch schon helfen.

himitsu 25. Jan 2014 19:06

AW: Problem mit ShellExecute und .pdf Dateien
 
Zitat:

will ich die Datei 'Test.pfd' anzeigen lassen.
Aber doch nicht etwa wirklich als relativen Pfad?

Zitat:

Zitat von Amateurprofi (Beitrag 1245341)
In den Datei-Eigenschaften von 'Test.pfd' steht ebenfalls "Öffnen mit Adobe Reader".

Eventuell dennoch nochmal über "Öffnen mit" das Standardprogramm "neu" auswählen, bzw. vorher nochmal kurz ein Anderes Programm auswählen, damit die Einträge neu erstellt werden.

Amateurprofi 26. Jan 2014 02:14

AW: Problem mit ShellExecute und .pdf Dateien
 
@himitsu:
Nein, natürlich nicht als relativer Pfad.
Der Dateiname wird vorher mit FullPath('Test.pdf') erweitert.
Ich wollte die Fragestellung nicht weiter komplizieren.

Delphi-Quellcode:
FUNCTION FullPath(const Dsn:String):String;
begin
   Result:=ExtractFilePath(ParamStr(0))+Dsn;
end;

schotti65 26. Jan 2014 13:45

AW: Problem mit ShellExecute und .pdf Dateien
 
Ähhh ganz simple Idee - Du hast in dem ersten Beitrag mehrmals pfd statt pdf verwendet - vielleicht auf deinem Rechner auch?

Amateurprofi 26. Jan 2014 17:47

AW: Problem mit ShellExecute und .pdf Dateien
 
Zitat:

Zitat von schotti65 (Beitrag 1245389)
Ähhh ganz simple Idee - Du hast in dem ersten Beitrag mehrmals pfd statt pdf verwendet - vielleicht auf deinem Rechner auch?

Oh, das ist mir jetzt etwas peinlich.
Aber: Nein, im Programm ist das schon korrekt.
Und: Dann würde ShellExecute nicht SE_ERR_NOASSOC zurückgeben sondern ERROR_FILE_NOT_FOUND, es sei denn, auch eine Test.pfd wäre vorhanden.
Trotzdem Danke für den Hinweis.

Amateurprofi 26. Jan 2014 20:32

AW: Problem mit ShellExecute und .pdf Dateien
 
Problem gelöst!
Ich habe den Nuance PDF Converter deinstalliert.
Nach mehrfachem ändern des .pdf zugeordneten Programms funktioniert das Öffnen mit ShellExcute jetzt.

hathor 27. Jan 2014 12:06

AW: Problem mit ShellExecute und .pdf Dateien
 
Es gibt mehrere Möglichkeiten, ein PDF zu öffnen:

Mit der Übergabe des Parameters open wird die Anwendung gestartet,
die unter shell/open/command bzw. shell/read/command steht.

Beispiel:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Explorer\FileExts\.pdf\UserChoice]
"ProgId"="FoxitReader.Document"

Mit nil wird die Standardanwendung gestartet.
Diese können identisch sein.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var fn : String;
begin
fn:=ExtractFilePath(ParamStr(0)) +'test-1.pdf';
ShellExecute(0,nil,PChar(fn),NIL,NIL,SW_SHOWNORMAL);
end;

procedure TForm1.Button4Click(Sender: TObject);
var fn : String;
begin
fn:=ExtractFilePath(ParamStr(0)) +'test-1.pdf';
ShellExecute(0,PChar('OPEN'),PChar(fn),NIL,NIL,SW_SHOWNORMAL);
end;

procedure TForm1.Button5Click(Sender: TObject);
var fn : String;
begin
fn:=ExtractFilePath(ParamStr(0)) +'test-1.pdf';
webbrowser1.Navigate(fn);
end;

procedure TForm1.Button6Click(Sender: TObject);
var fn : String;
begin
fn:=ExtractFilePath(ParamStr(0)) +'test-1.pdf';
ShellExecute(0,PChar('Foxit Reader.exe'),PChar(fn),NIL,NIL,SW_SHOWNORMAL);
end;
//AcroRd32.exe
procedure TForm1.Button7Click(Sender: TObject);
var fn : String;
begin
fn:=ExtractFilePath(ParamStr(0)) +'test-1.pdf';
ShellExecute(0, 'open','acrord32', PChar(fn),NIL,SW_SHOWNORMAL);
end;

procedure TForm1.Button9Click(Sender: TObject); //PRINT
var fn : String;
begin
fn:=ExtractFilePath(ParamStr(0)) +'test-1.pdf';
ShellExecute(0, 'open','acrord32', PChar('/p /h ' + fn), nil, SW_HIDE);
end;
PARAMETER

Open a PDF file: AcroRd32.exe PdfFile
Open a PDF file in a new instance of Adobe Reader: AcroRd32.exe /N PdfFile
Open a PDF file at page 7: AcroRd32.exe /A "page=7=OpenActions" PdfFile
Open a PDF file with navigation pane active, zoom out to 50%, and search for and highlight the word "batch":
AcroRd32.exe /A "zoom=50&navpanes=1=OpenActions&search=batch" PdfFile
Print a PDF file with dialog: AcroRd32.exe /P PdfFile
Print a PDF file silently: AcroRd32.exe /N /T PdfFile PrinterName [ PrinterDriver [ PrinterPort ] ]

DeddyH 27. Jan 2014 12:33

AW: Problem mit ShellExecute und .pdf Dateien
 
Mit nil wird nicht die Standardanwedung(?) gestartet, sondern die Standardaktion (so vorhanden) ausgeführt.
Zitat:

lpOperation [in, optional]
...
NULL

The default verb is used, if available. If not, the "open" verb is used. If neither verb is available, the system uses the first verb listed in the registry.


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