Entwickler-Ecke
Dateizugriff - Ist ein PDF Programm installiert?
Experience1986 - Di 24.01.06 12:17
Titel: Ist ein PDF Programm installiert?
Hi,
ich suche eine sichere Möglichkeit, wie ich überprüfen kann, ob ein Programm zum lesen von PDF Dateien installiert ist (Adobe Reader, Adobe Photoshop etc.).
Leider kann man nicht einfach so in der Registry so etwas abfragen, da Adobe an die entscheidenden Schlüssel Versionsnummer angehängt hat und somit kann man an dieser Stelle so etwas nicht prüfen...
Kennt Ihr da eine annähernd zuverlässige Lösung???
Andreas L. - Di 24.01.06 13:16
Ich denke wenn "HKEY_CLASSES_ROOT\.pdf" existiert ist eine Acrobat-Version installiert. Dort kannst du auch gleich herausfinden welches Programm PDF-Dateien öffnet: z. B. "HKEY_CLASSES_ROOT\.pdf\OpenWithList\AcroRd32.exe"
AXMD - Di 24.01.06 14:38
onlinehome hat folgendes geschrieben: |
Ich denke wenn "HKEY_CLASSES_ROOT\.pdf" existiert ist eine Acrobat-Version installiert. Dort kannst du auch gleich herausfinden welches Programm PDF-Dateien öffnet: z. B. "HKEY_CLASSES_ROOT\.pdf\OpenWithList\AcroRd32.exe" |
Letzteres könnte dir aber unter Win9x Probleme bereiten.
AXMD
Experience1986 - Di 24.01.06 14:38
Stimmt... bin ein Schussel.
Habs auch schon umsetzen können:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function CleanOpenCommand(Command:String):String; var i,j:integer; begin result:=''; for i:=1 to length(Command) do begin for j:=i to length(Command) do begin result:=result+Command[j]; if FileExists(Result) then begin exit; end; end; result:=''; end; end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| function GetPDFReader:String; var Reg:TRegistry; tmp:String; begin Result:='';
try
Reg:=TRegistry.Create(KEY_READ); Reg.RootKey:=HKEY_CLASSES_ROOT;
if Reg.OpenKey('.pdf', false) then begin tmp:=Reg.ReadString(''); Reg.CloseKey; if Reg.OpenKey(tmp+'\Shell\Open\Command', false) then begin tmp:=Reg.ReadString(''); Reg.CloseKey;
Result:=CleanOpenCommand(tmp); end;
end; finally Reg.Free; end;
end; |
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.Button1Click(Sender: TObject); begin showmessage(GetPDFReader); end; |
Danke.
Experience1986 - Di 24.01.06 14:40
Die Lösung die ich gerade gepostet habe sollte aber, soweit mir bekannt, auch unter Win9x laufen. Oder???
AXMD - Di 24.01.06 14:41
Experience1986 hat folgendes geschrieben: |
Die Lösung die gerade gepostet habe sollte aber, soweit mir bekannt, auch unter Win9x laufen. Oder??? |
IIRC hat Win9x keine OpenWithList.
AXMD
Experience1986 - Di 24.01.06 14:45
Mein Kode schaut aber doch zuerst in HKEY_CLASSES_ROOT\.pdf nach.
In diesem Fall steht dort "AcroExch.Document".
Also öffne ich dann HKEY_CLASSES_ROOT\AcroExch.Document. In diesem Schlüssel sind alle Befehle für Dateien die mit Acrobat Reader verknüpft sind.
Daher kann ich also HKEY_CLASSES_ROOT\AcroExch.Document\Shell\Open\Command öffnen und sollte somit auf jedem Windows System einen Adobe Reader Pfad (oder dergleichen) haben, zum. wenn PDF Dateien verknüpft sind.
Auf Windows XP funktioniert es mal problemlos
Delete - Di 24.01.06 14:53
Die Frage ist, ob man zu Zeiten, wo Windows Vista vor der Tür steht, noch Windows 9x unterstützt oder nicht. Laut meinen Webseitenstatistiken war im letzten Monat nioemand mit Windows 9x auf meinr Homepage.
Aber eigentlich wollte ich was anders sagen: Bei mir wird dein Code böse abstürzen. Du erzeugst das Registry Objekt ohne Angabe der Zugriffsart, also wird er mit KEY_ALL_ACCESS geöffnet. Da ich dort als eingeschränkter Benutzer nur Leserechte habe, wird das schief gehen. Desweiteren fehlt der Ressourcenschutzblock mit try-finally.
Experience1986 - Mi 25.01.06 19:13
Dein Wunsch ist mir Befehl.
Hab die Änderungen eingesetzt.
Delete - Mi 25.01.06 21:09
wenn du schon weisst, das ein reader vorhanden ist, dann kannst du doch auch die datei gleich öffnen. da brauchst nicht in der registry rumfummeln... und sollt auch unter 9x funktionieren.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure runpdf; var r: tfilerun; myPDF: string; begin myPDF := 'c:\pfad\datei.pdf'; r := tfilerun.create(self); try r.Filename := myPDF; r.execute; finally r.free; end; end; |
grüsse
wolf
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!