Delphi-PRAXiS
Seite 2 von 2     12   

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 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 00:13 Uhr.
Seite 2 von 2     12   

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