Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi IsAdobeReaderInstalled (https://www.delphipraxis.net/97200-isadobereaderinstalled.html)

PeterPanino 6. Aug 2007 17:57


IsAdobeReaderInstalled
 
Hallo,
Wie kann man verlässlich feststellen, ob Adobe Reader installiert ist?

Balu der Bär 6. Aug 2007 17:58

Re: IsAdobeReaderInstalled
 
Guck in der Registry ob da entspr. Einträge vorhanden sind.

shmia 6. Aug 2007 18:04

Re: IsAdobeReaderInstalled
 
Siehe: http://www.delphipraxis.net/internal...ct.php?t=82649
Den String 'Word.Application' muss man durch 'AcroPDF.PDF' ersetzen.

SirThornberry 6. Aug 2007 18:57

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?

PeterPanino 6. Aug 2007 20:54

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:
function IsAdobeReaderInstalled: Boolean;
var
  AdobeReader: OLEVariant;
begin
  try
    AdobeReader := CreateOLEObject('AcroPDF.PDF');
    try
      Result := true;
    finally
      AdobeReader := UnAssigned;
    end;
  except
    Result := false;
  end;
end;
Hier ist das adaptierte Beispiel, auf das du hingewiesen hast:

Delphi-Quellcode:
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;
Ich habe das erstere Beispiel auf zwei verschiedenen Computern ausprobiert (auf einem ist der Reader installiert, auf dem anderen nicht). Es funktioniert problemlos.

Rein prinzipiell: Welches der beiden Beispiele wäre empfehlenswerter?

Klaus01 6. Aug 2007 21:00

Re: IsAdobeReaderInstalled
 
Zitat:

Zitat von PeterPanino

An SirThornberry: Ich wollte wissen, ob AdobeReader installiert ist, da ich auf das ActiveX zugreifen möchte.

So weit ich das weiß, sind die ActiveX Objekte aber Versionsabhängig.
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

semo 6. Aug 2007 21:03

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....".

Kinimod8 6. Aug 2007 21:09

Re: IsAdobeReaderInstalled
 
Zitat:

Zitat von PeterPanino
Rein prinzipiell: Welches der beiden Beispiele wäre empfehlenswerter?

Siehe auch http://luckie-online.de/Developer/Ar...Exceptions.php

semo 6. Aug 2007 21:22

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;

PeterPanino 6. Aug 2007 21:30

Re: IsAdobeReaderInstalled
 
Zitat:

Zitat von Klaus01
So weit ich das weiß, sind die ActiveX Objekte aber Versionsabhängig.
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.

Wieso, die CLSID 'AcroPDF.PDF' müsste doch für alle Reader-Versionen gültig sein, oder?

PeterPanino 6. Aug 2007 21:32

Re: IsAdobeReaderInstalled
 
Zitat:

Zitat von computer-glossar.de
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;

Welchen Vorteil hätte das in Hinsicht auf die ursprüngliche Version?

andreash 6. Aug 2007 21:34

Re: IsAdobeReaderInstalled
 
Da bei nichtvorhandensein der Klasse CreateOLEObject eine Exception ausgibt, würde ich die zweite Variante bevorzugen; schließlich sollten Execption Ausnahmen bleiben.

semo 6. Aug 2007 22:19

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;

Klaus01 7. Aug 2007 07:39

Re: IsAdobeReaderInstalled
 
Zitat:

Zitat von PeterPanino
Zitat:

Zitat von Klaus01
So weit ich das weiß, sind die ActiveX Objekte aber Versionsabhängig.
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.

Wieso, die CLSID 'AcroPDF.PDF' müsste doch für alle Reader-Versionen gültig sein, oder?

Vielleicht magst Du dir diesen Thread einmal anschauen.

Grüße
Klaus

shmia 7. Aug 2007 11:29

Re: IsAdobeReaderInstalled
 
Zitat:

Zitat von PeterPanino
Delphi-Quellcode:
function ProgIDExists(const ProgID: WideString): Boolean;
var
  Tmp: TGUID;
begin
  Result := Succeeded(CLSIDFromProgID(PWideChar(ProgID), Tmp));
end;

function IsAdobePdfReaderInstalled: Boolean;
begin
  Result := ProgIDExists('AcroPDF.PDF');
end;
Rein prinzipiell: Welches der beiden Beispiele wäre empfehlenswerter?

Die 2. Variante ist besser!!
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.

generic 7. Aug 2007 12:01

Re: IsAdobeReaderInstalled
 
Zitat:

Zitat von PeterPanino
Hallo,
Wie kann man verlässlich feststellen, ob Adobe Reader installiert ist?

jup, du kannst den windowsinstaller fragen ob das produkt installiert ist.

a) mit der productguid
b) per iteration durch alle pakete und per suchen im "installed product name"

axellang 7. Aug 2007 15:22

Re: IsAdobeReaderInstalled
 
Zitat:

Zitat von PeterPanino
Hallo,
Wie kann man verlässlich feststellen, ob Adobe Reader installiert ist?

Code:

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;
Funktioniert natürlich mit fast allen gängigen Anwendungen (*.doc;*.xls, usw...)


all the best

Alexander


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