![]() |
IsAdobeReaderInstalled
Hallo,
Wie kann man verlässlich feststellen, ob Adobe Reader installiert ist? |
Re: IsAdobeReaderInstalled
Guck in der Registry ob da entspr. Einträge vorhanden sind.
|
Re: IsAdobeReaderInstalled
Siehe:
![]() Den String 'Word.Application' muss man durch 'AcroPDF.PDF' ersetzen. |
Re: IsAdobeReaderInstalled
Willst du wirklich wissen ob der Adobe-Reader installiert ist oder willst du nur wissen ob ein Programm zum öffnen von PDF-Dateien installiert/registriert ist?
|
Re: IsAdobeReaderInstalled
Vielen Dank an alle für die Tipps!
An SirThornberry: Ich wollte wissen, ob AdobeReader installiert ist, da ich auf das ActiveX zugreifen möchte. An shmia: Ich habe mittlerweile auch noch einen anderen Code gefunden, den ich so für Adobe Reader adaptiert habe:
Delphi-Quellcode:
Hier ist das adaptierte Beispiel, auf das du hingewiesen hast:
function IsAdobeReaderInstalled: Boolean;
var AdobeReader: OLEVariant; begin try AdobeReader := CreateOLEObject('AcroPDF.PDF'); try Result := true; finally AdobeReader := UnAssigned; end; except Result := false; end; end;
Delphi-Quellcode:
Ich habe das erstere Beispiel auf zwei verschiedenen Computern ausprobiert (auf einem ist der Reader installiert, auf dem anderen nicht). Es funktioniert problemlos.
function ProgIDExists(const ProgID: WideString): Boolean;
var Tmp: TGUID; begin Result := Succeeded(CLSIDFromProgID(PWideChar(ProgID), Tmp)); end; function IsWordInstalled: Boolean; begin Result := ProgIDExists('AcroPDF.PDF'); end; Rein prinzipiell: Welches der beiden Beispiele wäre empfehlenswerter? |
Re: IsAdobeReaderInstalled
Zitat:
Also wenn Dein Programm das ActiveX Object für AdobeReader Version 6 einbindet wird es vermutlich nicht mit AdobeReader Version 7 arbeiten. Unabhängiger bist Du, wenn Du das pdf im TWebbrowser anzeigen läßt. Auch hier muß ein AdobeReader installiert sein, es ist aber gleich welche Version. Grüße Klaus |
Re: IsAdobeReaderInstalled
am sichersten ist immer eine kombination.
aus irgendeinem grund ist der rechner des clients mal ein wenig anders konfiguriert. deshalb sind mehrere ausweichfälle nur von vorteil für den programmierer, damit du später dir nicht vor den kofp schlägst und sagen musst: "hätte ich doch gleich mal....". |
Re: IsAdobeReaderInstalled
Zitat:
![]() |
Re: IsAdobeReaderInstalled
bezugnehmend auf Kinimod8: man kann mit varIsEmpty() arbeiten.
der erste fall würde dann also so aussehen:
Delphi-Quellcode:
function IsAdobeReaderInstalled(): Boolean;
var AdobeReader: OLEVariant; begin AdobeReader := CreateOLEObject('AcroPDF.PDF'); Result := not VarIsEmpty(AdobeReader); if Result then AdobeReader := UnAssigned; end; |
Re: IsAdobeReaderInstalled
Zitat:
|
Re: IsAdobeReaderInstalled
Zitat:
|
Re: IsAdobeReaderInstalled
Da bei nichtvorhandensein der Klasse CreateOLEObject eine Exception ausgibt, würde ich die zweite Variante bevorzugen; schließlich sollten Execption Ausnahmen bleiben.
|
Re: IsAdobeReaderInstalled
@ andreash: du hast recht, hab eben noch mal nachgesehen.
hier ein beispiel was ich mal für den zugriff auf word genutzt habe. dann halt doch mit try except :-)
Delphi-Quellcode:
try
word := GetActiveOleObject('Word.Application'); except // Läuft Word noch nicht, wird eine neue Verbindung aufgebaut try Word := CreateOleObject('Word.Application'); except // Schlägt dies fehl (Word nicht installiert), gibt es eine Fehlermeldung MessageDlg( 'Microsoft Word kann nicht starten. Ist Microsoft Word überhaupt installiert?', mtWarning, [mbOK],0); Word := unassigned; end; end; |
Re: IsAdobeReaderInstalled
Zitat:
![]() Grüße Klaus |
Re: IsAdobeReaderInstalled
Zitat:
Begründung: Es wird nicht versucht, den PDF-Reader tatsächlich zu erzeugen, nur um ihn 5 Millisekunden später wieder zu schliessen. Es sollte klar sein, dass die 2. Variante wesentlich weniger Resourcen (RAM, Proz.Zyklen) benötigt, da nur überprüft wird, ob die Prog-ID vorhanden ist. |
Re: IsAdobeReaderInstalled
Zitat:
a) mit der productguid b) per iteration durch alle pakete und per suchen im "installed product name" |
Re: IsAdobeReaderInstalled
Zitat:
Code:
Funktioniert natürlich mit fast allen gängigen Anwendungen (*.doc;*.xls, usw...)function CleanOpenCmd(Cmd:String):String; var i,j:integer; begin result:=''; for i:=1 to length(Cmd) do begin for j:=i to length(Cmd) do begin result:=result+Cmd[j]; if FileExists(Result) then begin exit; end; end; result:=''; end; end; // Ermittelt die Anwendung mit der standardgemäß die Dateien verknüpft sind. function IsAppOnBoard(FileExt:string):String; var Reg:TRegistry; tmp:String; begin Result:=''; Reg:=TRegistry.Create(KEY_READ); try Reg.RootKey:=HKEY_CLASSES_ROOT; // False, weil der Schlüssel nicht automatisch erstellt werden soll if Reg.OpenKey(FileExt, False) then begin tmp:=Reg.ReadString(''); Reg.CloseKey; if Reg.OpenKey(tmp+'\Shell\Open\Command', False) then begin tmp:=Reg.ReadString(''); Reg.CloseKey; Result:=CleanOpenCmd(tmp); end; end; finally Reg.Free; end; end; // Beispiel procedure TForm1.Button1Click(Sender: TObject); begin showmessage(IsAppOnBoard('.pdf')); end; all the best Alexander |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 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