AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Datentypen in der Registry
Thema durchsuchen
Ansicht
Themen-Optionen

Datentypen in der Registry

Ein Thema von delnu · begonnen am 17. Okt 2015 · letzter Beitrag vom 22. Okt 2015
Antwort Antwort
delnu
(Gast)

n/a Beiträge
 
#1

Datentypen in der Registry

  Alt 17. Okt 2015, 00:35
Leider habe ich lange nichts mehr mit Delphi gemacht und darum etwas den Überblick verloren.

Weil ich momentan einen ganze Schwung billig erworbener gebrauchter PCs einzurichten habe, bin ich es leid, überall die Dateitypen manuell einzutragen. Es geht darum, grundsätzlich für multimediale Inhalte portable Programme zuzuweisen.

Das sind z.B. vor allem IrfanView und VLC.

Leider komme ich mit der Registry nicht weiter. Es geht zunächst um das Ermitteln der aktuellen Einträge, ehe daran zu denken ist, neue einzutragen. Das ist nämlich nur nötig, wenn die gewünschte Zuweisung noch nicht existiert.

Wenn ich die Dateitypen unter HKEY_CLASSES_ROOT auslese, bekomme ich z.B. für Dateien, die eigentlich mit IrfanView geöffnet werden sollen, überall rundll32.exe C:\WINDOWS\system32\shimgvw.dll,ImageView_Fullscre en %1 als Ergebnis.

Die Zuweisungen für IrfanView und anderes finde ich hingegen bei direkter Suche mit Regedit unter HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Explorer\FileExts, aber dann auch immer nur mit OpenWithList und OpenWithProgids.

Wie finde ich das mit Delphi? Und wie kann ich die von mir gewünschten Einträge allgemeingültig als Vorgaben setzen, also bei HKEY_CLASSES_ROOT ?

Meine bisherigen Tests basieren auf Beiträgen, die ich hier im Forum fand. Weil sie aber alle nicht genau das machten, was ich wissen will, mußte ich sie anpassen, um überhaupt Ergebnisse zu bekommen. Weil das im Endeffekt nichts brachte, habe ich das wieder gelöscht und stehe am Anfang.

Kann mir jemand irgendwie weiterhelfen? Es geht um alte Delphi-Versionen (3, 4, 5, 7) und alte Windows-Versionen (98SE, XP).

Bitte keine Kommentare zu "veraltet, unsicher" usw., denn es ist eine Kostenfrage, eine Frage des Prinzips und hat praktische Gründe, die zu erläutern themenfremd wäre.

Danke.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#2

AW: Datentypen in der Registry

  Alt 17. Okt 2015, 01:55
Ich würde da nicht das Rad neu erfinden und auf die Möglichkeiten zurückgreifen, die die Programme bzw. deren Setups eh schon bieten. Das geht, indem man die Programme unbeaufsichtigt installiert - was sich bei einer Menge von Rechnern ja sowieso anbietet. IrfanView hat die Schalter alle in der FAQ zusammengefasst, hier die fürs Setup (für das Thema ist vor allem /assoc bzw. /assocallusers relevant). Für VLC gibt's auch entsprechende Anleitungen, normalerweise reicht dort aber einfach Schalter /S, und standardmäßig krallt sich VLC sowieso alle Dateitypen, die er kennt (was nicht meine Zustimmung findet, aber das ist ja nicht das Thema).

MfG Dalai
  Mit Zitat antworten Zitat
delnu
(Gast)

n/a Beiträge
 
#3

AW: Datentypen in der Registry

  Alt 17. Okt 2015, 06:19
Danke erstmal, ABER:

1.) Es geht um PORTABLES. Ich will nichts installieren.
2.) IrfanView und VLC sind lediglich Beispiele, weil für diese Progs viele Dateitypen in Betracht kommen.

Es geht in jedem Fall darum, daß ich für genau die in meinem Eingangspost aufgeworfenen Fragen, also Zugriffs auf die Registry, Lösungsansätze suche.

Also bitte keine solchen "Antworten" mehr, bei denen sich mir nur die sarkastische Frage stellt: "Klar, warum programmieren wir eigentlich noch selbst, wenn es doch schon soviele, fertige eiernde Räder gibt ?" !!!

Bei der Menge von Rechnern bietet sich für mich nur eine einzige zeitsparende Lösung an und die heißt:

Fertiges Verzeichnis der Portables inklusiv alles Unterverzeichnisse komplett auf die Zielrechner kopieren. Ich habe Gründe, soviele Portables wie möglich zu benutzen.

Und gerade weil sich diverse Programme einfach alle Endungen "krallen", will ich selbst die Kontrolle haben. Schlimmstes Beispiel ist ja Microsoft selbst, das einem für fast alles "fertige Lösungen" = sprich fürchterliche "Programme" als Vorgaben unterjubelt. Die will ich nämlich auch komplett entfernen und durch Zuweisungen auf vernünftige Programme ersetzen.

Auf einem meiner Bootsysteme (ich benutze meist Multiboot) habe ich gerade feststellen müssen, daß sich hier "Nero" fast alles gekrallt hat. Auch um sowas nachträglich wegzubekommen, geht es nicht ohne Registry, wenn man nicht alles zeitraubend manuell entfernen will.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Datentypen in der Registry

  Alt 17. Okt 2015, 11:38
ungetestete Idee:
Delphi-Quellcode:
uses Registry;

function RegisterProg(
                      sFileType : String; // wird im Explorer als Typ angezeigt
                      sStandard : String; // Inhalt des Eintrages (Standard) in der Registry
                      sProgram : String; // vollständiger Pfad zum Programm
                      sExt : String // zu verknüpfende Dateiendung
                     ) : Boolean;
var
  Reg : TRegistry;
begin
  Result := True;
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CLASSES_ROOT;
  Reg.OpenKey(sExt, True);
  try
    Reg.WriteString('', sFileType);
  except
    Result := False;
  end;
  Reg.CloseKey;
  if Result then begin
    Reg.OpenKey(sFileType, True);
    try
      Reg.WriteString('', sStandard);
    except
      //
    end;
    Reg.OpenKey('shell', True);
    Reg.OpenKey('open', True);
    Reg.OpenKey('command', True);
    try
      Reg.WriteString('',Format('"%s" "%s"',[sProgram,'%1']));
    except
      //
    end;
    Reg.CloseKey;
    Reg.CloseKey;
    Reg.CloseKey;
    Reg.CloseKey;
  end;
  Reg.Free;
end;

// Aufruf:
begin
  RegisterProg('BMP IrfanView','IrfanView','c:\Programme\IrfanView\iview32_.exe','.bmp');
  RegisterProg('JPG IrfanView','IrfanView','c:\Programme\IrfanView\iview32_.exe','.jpg');
  RegisterProg('JPG IrfanView','IrfanView','c:\Programme\IrfanView\iview32_.exe','.jpeg');
end;
Der Aufruf von RegisterProg ließe sich sicherlich auch über eine Ini-Datei (o. ä.) realisieren, so dass die einzelnen Verknüpfungen nicht fest im Programm verdrahtet werden müssen.

Aufbau der INI-Datei:
Code:
[JPEG]
FileType=JPG IrfanView
Standard=IrfanView
Program=c:\Programme\IrfanView\iview32_.exe
Ext=.jpg
[JPEG]
FileType=JPG IrfanView
Standard=IrfanView
Program=c:\Programme\IrfanView\iview32_.exe
Ext=.jpeg
Aufrufroutine bei die Nutzung einer Ini-Datei:
Delphi-Quellcode:
uses IniFiles;

var
      ini : TIniFile;
      sl : TStringList;
      i : Integer;
      sFileType : String;
      sStandard : String;
      sProgram : String;
      sExt : String;
begin
  ini := TIniFile.Create('Verknüpfungen.ini');
  sl := TStringList.Create;
  ini.ReadSections(sl);
  for i := 0 to sl.Count - 1 do begin
    sFileType := ini.ReadString(sl[i],'FileType','');
    sStandard := ini.ReadString(sl[i],'Standard','');
    sProgram := ini.ReadString(sl[i],'Program','');
    sExt := ini.ReadString(sl[i],'Ext','');
    RegisterProg(sFileType,sStandard,sProgram,sExt);
  end;
  sl.Free;
  ini.Free;
end;
und als Konsolenprogramm:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Registry, IniFiles, Windows, Classes;

function RegisterProg(
                      sFileType : String; // wird im Explorer als Typ angezeigt
                      sStandard : String; // Inhalt des Eintrages (Standard) in der Registry
                      sProgram : String; // vollständiger Pfad zum Programm
                      sExt : String // zu verknüpfende Dateiendung
                     ) : Boolean;
var
  Reg : TRegistry;
begin
  Result := True;
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CLASSES_ROOT;
  Reg.OpenKey(sExt, True);
  try
    Reg.WriteString('', sFileType);
  except
    Result := False;
  end;
  Reg.CloseKey;
  if Result then begin
    Reg.OpenKey(sFileType, True);
    try
      Reg.WriteString('', sStandard);
    except
      //
    end;
    Reg.OpenKey('shell', True);
    Reg.OpenKey('open', True);
    Reg.OpenKey('command', True);
    try
      Reg.WriteString('',Format('"%s" "%s"',[sProgram,'%1']));
    except
      //
    end;
    Reg.CloseKey;
    Reg.CloseKey;
    Reg.CloseKey;
    Reg.CloseKey;
  end;
  Reg.Free;
end;

function ReadIniFile(sIniFile : String) : Boolean;
var
  ini : TIniFile;
  sl : TStringList;
  i : Integer;
  sFileType : String;
  sStandard : String;
  sProgram : String;
  sExt : String;
begin
  Result := FileExists(sIniFile);
  if Result then begin
    WriteLn(Format('%s:',[sIniFile]));
    sl := TStringList.Create;
    ini := TIniFile.Create(sIniFile);
    ini.ReadSections(sl);
    for i := 0 to sl.Count - 1 do begin
      sFileType := ini.ReadString(sl[i],'FileType','');
      sStandard := ini.ReadString(sl[i],'Standard','');
      sProgram := ini.ReadString(sl[i],'Program','');
      sExt := ini.ReadString(sl[i],'Ext','');
      if RegisterProg(sFileType,sStandard,sProgram,sExt) then begin
        WriteLn(Format('Verknuepfung %s wurde erstellt.',[sFileType]));
      end else begin
        WriteLn(Format('Verknuepfung %s konnte nicht erstellt werden.',[sFileType]));
      end;
    end;
    ini.Free;
    sl.Free;
  end;
end;

var
  k : Integer;
begin
  if ParamCount < 1 then begin
    WriteLn('Aufruf:');
    WriteLn(Format('%s Ini-Datei [,Ini-Datei ... ,Ini-Datei]',[ParamStr(0)]));
    Halt(1);
  end;
  for k := 1 to ParamCount do begin
    if not ReadIniFile(ParamStr(k)) then begin
      WriteLn(Format('Die INI-Datei %s wurde nicht gefunden.',[ParamStr(k)]));
    end;
  end;
end.
  Mit Zitat antworten Zitat
delnu
(Gast)

n/a Beiträge
 
#5

AW: Datentypen in der Registry

  Alt 18. Okt 2015, 03:17
Wahnsinn !

Das ist ja schon erheblich mehr als die erhofften Denkanstöße.
Das werde ich mir gleich mal ansehen.

Danke !
  Mit Zitat antworten Zitat
delnu
(Gast)

n/a Beiträge
 
#6

AW: Datentypen in der Registry

  Alt 19. Okt 2015, 23:58
Noch habe ich mich nicht dran gewagt, tatsächlich selbst Verknüpfungen in die Registry zu schreiben.

Aber der Tipp mit INI-Dateien ist wirklich gut.

Anbei mal ein Zwischenstand als Anhang. Das ist alles noch etwas wirr, aber der Zweig HKEY_CLASSES_ROOT wird lesend ausgewertet.

Dazu habe ich mich folgender Quelle bedient: http://www.swissdelphicenter.ch/de/showcode.php?id=1618

Alle Verknüpfungen können nach unmterschiedlichen Kriterien als INI-Datei gespeichert werden.

Außerdem habe ich die Möglichkeit eingebaut, mittels Textdateien, die pro Zeile eine Endung enthalten, zu prüfen, ob es dafür bereits Verknüpfungen gibt. Diese Dateien können nach bestimmten Kriterien angelegt werden, z.B. Audio, Grafik, Dokumente, Video usw.

Ein paar Beispiele sind enthalten.

Leider ist es aber so, daß bei weitem nicht alle zugewiesenen Dateitypen unter HKEY_CLASSES_ROOT gespeichert sind. Die meisten Sachen sind unter HKEY_CURRENT_USER, im Zweig "Software\Microsoft\Windows\CurrentVersion\Explore r\FileExts". Aber wie man das ausliest, habe ich noch nicht rausgefunden.

Vielleicht kann mir da jemand weiterhelfen ?

Ein besonderes Problem dabei sind "OpenWithList" und "OpenWithProgIds" ...

Bevor ich Schreibfunktionen einbaue, möchte ich die Analyse komplettieren. Und bevor es dann soweit ist, muß noch die Möglichkeit eingebaut werden, die vorherigen Werte zu sichern und ggf. wieder herzustellen.

Für jeden weiteren Rat bin ich dankbar.
Angehängte Dateien
Dateityp: zip reg.zip (236,2 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 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 by Thomas Breitkreuz