Autor Beitrag
Experience1986
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Di 24.01.06 12:17 
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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Di 24.01.06 14:38 
Stimmt... bin ein Schussel.

Habs auch schon umsetzen können:
ausblenden Delphi-Quelltext
1:
2:
// Ermöglicht einen Zugriff auf die Windows Registrierung
uses Registry;



ausblenden 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;


ausblenden 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;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
// Anwendungsbeispiel
procedure TForm1.Button1Click(Sender: TObject);
begin
   showmessage(GetPDFReader);
end;



Danke.


Zuletzt bearbeitet von Experience1986 am Mi 25.01.06 19:12, insgesamt 1-mal bearbeitet
Experience1986 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Di 24.01.06 14:40 
Die Lösung die ich gerade gepostet habe sollte aber, soweit mir bekannt, auch unter Win9x laufen. Oder???


Zuletzt bearbeitet von Experience1986 am Di 24.01.06 14:41, insgesamt 1-mal bearbeitet
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Mi 25.01.06 19:13 
Dein Wunsch ist mir Befehl.

Hab die Änderungen eingesetzt.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.

ausblenden 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