Hallo Leute,
dies hier ist mein erstes Tutorial, also nicht hauen, wenn irgendwas komisch oder unverständlich ist
[meta]Dateitypen Definition Dateitypendefinition EditFlags ProgID[/meta]
In
diesem Thread ging es darum, dem Neu-Menü von Windows einen Eintrag hinzuzufügen. Über die Diskussion sind wir dann auf die Organisation von Dateitypen in der Windows-Registry gekommen und
sango meinte, dass, wenn ich so viel über die Dateitypen in der Registry wüsste, ich doch mal ein Tutorial schreiben könnte. Nun Gut, dann tue ich das mal dachte ich. Soviel zu der Entstehungsgeschichte. Los gehts...
HKEY_CLASSES_ROOT
Die Registry ist, wie die meisten mitlerweile sicherlich wissen, in sieben Abschnitte unterteilt, die sogenannten HKEYs. Bedeutet laut MathiasSimmack
Handle auf einen
Key.
Für die Dateitypen ist besonders der HKEY_CLASSES_ROOT von Bedeutung.
Um das folgende mitzuverfolgen, schlage ich vor, den Registrierungseditor zu starten (Start -> Ausführen -> regedit.exe), damit man sozusagen "live" dabei ist. Der HKEY_CLASSES_ROOT Schlüssel müsste ganz oben, gleich unter Arbeitsplatz zu sehen sein.
HKEY_CLASSES_ROOT ist eigentlich garkein selbstständiger Registryschlüssel, sondern ein Zusammenschnitt aus den beiden Schlüsseln
HKEY_LOCAL_MACHINE\Software\Classes und
HKEY_CURRENT_USER\Software\Classes. Bearbeitungen in Classes_Root führen aber nach meinem Rumprobieren immer nach Local_Machine\..\Classes.
Wie auch immer, wenn man HKEY_CLASSES_ROOT öffnet, bekommt man eine Vielzahl an Unterschlüsseln zu sehen. Der erste dürfte
* heißen und die nächsten beginnen höchstwahrscheinlich alle meit einem
. und werden dann von einer Dateierweiterung gefolgt. Unter diesen
.xxx-Schlüsseln gibt es noch viele Weitere Schlüssel, die beliebige Namen haben, aber häufig findet man in ihnen Namen von Programmen wieder (z.B.
7-Zip.7z für die Definition des Dateitypes 7z vom Programm 7-Zip). Das muss aber nicht sein.
Aufbau - Beispiel: Textdateien
Schauen wir uns nun einmal den Schlüssel
.txt an. In der Windows-Standardeinstellung enthält er drei Werte: Den Stringwert (REG_SZ)
(standard), der übrigens in jedem Schlüssel vorhanden ist,
Content Type und
PercievedTxpe. Die beiden letzten haben etwas mit MIME zu tun (es gibt im Classes-Schlüssel auch einen Schlüssel namens MIME, den man sich mal anschauen kann, aber wozu man das ausnutzen kann, was da drin steht, weiß ich noch nicht). Der Wert (standard) ist aber für uns von Bedeutung. In der Standardeinstellung steht dort
txtfile. Nun suchen wir den Schlüssel
txtfile (das ist die ProgID - Programm-ID vermute ich). Er ist unter diesen Schlüsseln mit den beliebigen Namen. Wenn wir ihn gefunden haben, schauen wir ihn uns mal an. Der Wert
(standard) enthält den String
Textdokument. Dieser String wird im Windows-Explorer immer in der Spalte "Typ" angezeigt. Damit kann man also die Typenbeschreibung für einen Dateityp festlegen. Darunter befinden sich vielleicht noch andere Werte. Einer von diesen dürfte
EditFlags heißen. Auf den gehe ich später nochmal ein. Nun schauen wir uns die Unterschlüssel von txtfile an. Bei mir sind es genau 2. Einer heißt DefaultIcon und der andere Shell.
Zunächst zu
DefaultIcon. Was kann da bloß drinstehen
logisch, das Symbol für den Dateityp. Der Wert (standard) enthält hier den Pfad und den Index des Symbols. In der Standardeinstellung steht dort wahrscheinlich
shell32.dll,151 oder so... ich hab ein anderes Symbol für TXT-Dateien und somit weiß ich Standardeinstellung nicht genau... Das Symbol befindet sich also in der Datei (z.B. (
C:\WINDOWS\system32\)
shell32.dll an Position (
Index) 151 in der Bibliothek. Postitve Zahlen sprechen Icon-Indexe an, negative Werte Ressourcen-IDs.
Und nun zu
Shell. Shell hat bei mir (Win XP) drei Unterschlüssel: open, print und printto. Den Inhalt des Schlüssels open benutzt Windows immer, wenn wir auf Textdateien Rechts-Klicken und wir auf
Öffnen gehen. Dieser Schlüssel ist also der Kontextmenü-Eintrag. Für gewöhnlich steht im Wert (Standard) eines solchen Schlüssels die Beschriftung des Menü-Eintrags, aber Schlüssel mit den Namen open, edit, print und printto "überstetzt" Windows schon von sich aus (vllt. gibt es noch weitere, die mir nicht bekannt sind). So wird aus open Öffnen und aus print Drucken. Shortcut-Keys kann man mit dem &-Zeichen in die Beschriftung setzen, wie in Delphi
open hat einen Unterschlüssel namens
command. Der Wert (standard) dieses Schlüssels enthält den Befehl, mit dem eine Datei bei Wahl dieses Menüeintrages ausführt. Zum Bleistift: notepad.exe "%1". %1 steht für den Dateinamen, der dem Programm übergeben wird. Die "
müssen dort stehen, denn sonst gibt es Fehler beim Öffnen von Dateien mit Leerzeichen im Pfad. In den Programmpfaden können auch Umgebungsvariablen verwendet werden. Der Schlüssel Shell selbst hat auch einen Wert (standard). Dort steht der Name des Schlüssels mit dem Menüeintrg, der beim Doppelklick auf eine Datei ausgeführt wird. Im Dateienkontextmenü steht er dann ganz oben und ist fett gedruckt.
EditFlags
Die EditFlags-Werte legen fest, was man in dem von Windows bereitgestellten Dialog zum Ändern von Dateitypen verändern darf und kann. Der Dialog ist übrigens unter Systemsteuerung\Ordneroptionen -> Dateitypen versteckt. Oder auch im Explorer: Extras -> Ordneroptionen. Mit diesen Werten kann man bestimmte Buttons dort abschalten. Unter Windows 95 sind die EditFlags Binärwerte (REG_BINARY). Unter Windows XP sind es DWORD-Werte (0x########) (REG_DWORD). Eine Liste der DWORD-Werte gibt es
hier.
Eigene Dateitypen - Beispiel: PAS-Datei
Damit kann man schon eine Menge anfangen. Ich habe mir zum Beispiel meine pas-Dateien neu definiert, da D2k5 die Einstellung einfach überschreibt...
Zuerst habe ich mir einen neuen Schlüssel angelegt (
#pasfile, das # weil ich Konflikte mir anderen Progs, die vllt. pasfile schreiben vermeiden wollte). Na ja, nicht ganz. Zuallererst habe ich mir ein Symbol gemalt
Dann habe ich folgende Werte gesetzt und Schlüssel erstellt:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| #pasfile (standard) = Pascal/delphi Quellcode EditFlags (REG_BINARY) = 02000000 | |-Shell (standard) = open.lazarus | | | |-open.bds (standard) = Mit &Delphi 2005 öffnen | | | | | |-command (standard) = "C:\Programme\Borland\BDS\3.0\Bin\bds.exe" /np | | | |-open.lazarus (standard) = Mit &Lazarus öffnen | | | | | |-command (standard) = c:\lazarus\lazarus.exe "%1" | | | |-open.fpc (standard) = Mit &Freepascal öffnen | | | |-command (standard) = C:\FPC\2.0.0\bin\i386-win32\fp.exe "%1" | |-DefaultIcon (standard) = C:\Dokumente und Einstellungen\All Users\Dokumente\Icons\Pascal-Delphi Unit.ico,0 |
Und heraus kommt... (Anhang: Bild 1, Bild 2)
Übrigens: 02000000 hat Windows XP bei mir automatisch zu 0x00000002 gemacht, nachdem ich in dem Dialog noch was geändert hatte.
MathiasSimmack hat noch einen
Link zum MSDN gepostet, wo das alles nocheinmal von MS beschrieben ist (englisch).
Die EditFlags stehen dort auch dokumentiert.
Benutzerspezifische Dateitypenbelegung (Windows XP)
In den früheren Windows Versionen vor Win XP konnten die Dateitypen nun von jedem Nutzer einfach umgelegt werden. Der eine will Bitmaps mit Paint öffnen, der andere mit COREL Photo-Paint... Nun stellt jeder es sich nach seinen Wünschen um und der nächste kommt und ändert es wieder zurück.
Aufregung
Unter Windows XP haben sich die MS-Leute da was einfallen lassen: Jeder Benutzer kann sich seine Dateitypen selbst belegen. HKEY_CLASSES_ROOT repräsentiert wie oben beschrieben die zwei Classes-Schlüssel und Änderungen in Classes_Root werden auf den alle Benutzer betreffenden Schlüssel übertragen. Die Einstellung für die einzelnen Benutzer findet man für sich unter HKEY_CURRENT_USER und dort unter \Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts. Da haben wir wieder eine Liste mit den Endungen (.xxx). Jetzt kann man in einen von diesen mit der gewünschten Endung einen REG_SZ (String) Wert reinsetzen mit dem Namen
Progid. Und in den schreibt man nun den Schlüsselnamen seiner Definition (bei mir z.B. #pasfile). Jetzt gelten für mich die Einstellungen in meiner Definition für diesen Dateityp. Das hat (für mich zumindest) folgenden Vorteil: einige Programe reißen sich konsequent einige Dateitypen unter den Nagel (Delphi ist eins davon, Lazarus macht es auch...) und immer wenn man in dem Programm was ändert oder es gar nur startet, werden die Programmeinstellungen für die Dateitypen wieder festgeschrieben (ist Delphi oder Lazarus keins von ^^), obwohl man sie sich ggf. gerade zu seinen Gunsten verändert hat. Das passiert mit der HKEY_CURRENT_USER Methode nicht, da die Programme für gewöhnlich immer im HKEY_CLASSESR_ROOT rumfummeln. Das HKEY_CURRENT_USER Teil wird aber nicht abgeändert und steht sozusagen über dem HKEY_CLASSES_ROOT Eintrag.
AN DIE PROGRAMMIERER: Nutzt das ja nicht für eure Programnme aus, sodass immer eure Programme benutzt werden! An dem FileExt-Schlüssel unter HKEY_CURRENT_USER haben Programme (meiner Ansicht nach) nichts zu suchen!!!
Benutzerspezifische Dateitypen (allgemein)
Oben hab ich geschrieben, dass HKEY_CLASSES_ROOT ein Zusammenschnitt aus
HKEY_LOCAL_MACHINE\Software\Classes und
HKEY_CURRENT_USER\Software\Classes ist. Ja aber Moment,
HKCU\... gilt doch auch nur für mich und ich störe die anderen damit nicht? *klick* exakt! Hab aber selbst erstmal rausfinden müssen, dass dies überhaupt der Fall ist
Wenn wir also statt
HKCR den
HKCU\Software\Classes-Schlüssel bearbeiten, dann können wir das 1. ohne Administratorrechte und 2. für andere ungestört machen.
Das Bild ist in
HKCU\Software\Classes dasselbe wie in HKCR\, nur dass hier viel weniger Schlüssel sind. Die Bedutung der Schlüssel ist natürlich auch die gleiche.
Ich hoffe das Tutorial war recht informativ für das Volk
Grüße
JayK.
EDIT
24.06.2005 19:58: Überflüssige Zeilenumbrüche entfernt
EDIT
25.06.2005 11:35: Link von Mathias hinzugefügt
EDIT
17.01.2006 18:53: ein paar Rechtschreibfehler korrigiert
EDIT
28.11.2006 16:50: Abschnitt "Benutzerspezifische Dateitypen (allgemein)" hinzugefügt, HKCU\Software\Classes eingearbeitet