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

user profile icononlinehome 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:
// Ermöglicht einen Zugriff auf die Windows Registrierung
uses Registry;




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
// Sucht in einem String nach einem gültigen Dateipfad
// Bsp: "C:\Programme\Adobe\Acrobat 7.0\Reader\AcroRd32.exe" "%1"
//  =>   C:\Programme\Adobe\Acrobat 7.0\Reader\AcroRd32.exe
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:
// Ermittelt die Anwendung mit der standardgemäß PDF Dateien verknüpft sind.
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:
// Anwendungsbeispiel
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

user profile iconExperience1986 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