Registriert seit: 21. Aug 2003
4.856 Beiträge
|
Dateiendungen registrieren
12. Jun 2004, 12:58
Hier eine möglichkeit, eine eigene dateiendung zu registrieren:
Delphi-Quellcode:
function InstallExt(Extension, ExtDescription, FileDescription,
OpenWith, ParamString: string; IconIndex: Integer;
ExtVerb: string = 'Open'): Boolean;
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
with Reg do
begin
RootKey := HKEY_CLASSES_ROOT;
OpenKey(Extension, True);
WriteString('', ExtDescription);
OpenKey('\' + ExtDescription, True);
WriteString('', FileDescription);
OpenKey('DefaultIcon', True);
WriteString('', OpenWith + ','+IntToStr(IconIndex));
OpenKey('\' + ExtDescription + '\Shell\'+ExtVerb+'\Command', True);
WriteString('', '"' + OpenWith + '" "' + ParamString + '"');
end;
Result := True;
except
Result := False;
end;
Reg.Free;
end;
und die passende deinstallationsroutine dazu:
Delphi-Quellcode:
function UnInstallExt(Extension, ExtDescription: String): Boolean;
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
with Reg do
begin
RootKey := HKEY_CLASSES_ROOT;
DeleteKey(Extension);
DeleteKey('\' + ExtDescription);
end;
Result := True;
except
Result := False;
end;
Reg.Free;
end;
und hier noch eine möglichkeit von MathiasSimmack die hier veröffentlicht wurde:
Delphi-Quellcode:
uses
Registry, ShlObj;
function RegisterFileType(const szExtension,
szInternalName,
szDescription,
szFileIcon : string): boolean;
var
reg : TRegistry;
begin
// benötigt Admin-Rechte zum Schreiben in HKEY_CLASSES_ROOT
Result := (IsAdmin) and
// die Dateiendung sollte mehr als 1 Zeichen haben, denn ...
(length(szExtension) > 1) and
// ... das erste Zeichen muss ein Punkt sein
(szExtension[1] = '.') and
// und die anderen Parameter dürfen nicht leer sein
(szInternalName <> '') and
(szDescription <> '') and
(szFileIcon <> '');
if(Result) then
begin
Result := false;
reg := TRegistry.Create;
if(reg <> nil) then
try
reg.RootKey := HKEY_CLASSES_ROOT;
// lege Schlüssel für Dateiendung mit Verweis auf
// internen Namen an
if(reg.OpenKey(szExtension,true)) then
try
reg.WriteString('',szInternalName);
Result := (reg.ReadString('') = szInternalName);
finally
reg.CloseKey;
end;
// lege Schlüssel mit internem Namen an
if(Result) and
(reg.OpenKey(szInternalName,true)) then
try
// Beschreibung für Dateityp eintragen
reg.WriteString('',szDescription);
Result := (Result) and
(reg.ReadString('') = szDescription);
if(reg.OpenKey('DefaultIcon',true)) then
try
reg.WriteString('',szFileIcon);
Result := (Result) and
(reg.ReadString('') = szFileIcon);
finally
reg.CloseKey;
end;
finally
reg.CloseKey;
end;
finally
reg.Free;
end;
// das System über die Änderung "informieren"
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,nil,nil);
end;
end;
function UnregisterFileType(const szExtension: string): boolean;
var
reg : TRegistry;
s : string;
begin
Result := (IsAdmin) and
(length(szExtension) > 1) and
(szExtension[1] = '.');
if(Result) then
begin
reg := TRegistry.Create;
if(reg <> nil) then
try
reg.RootKey := HKEY_CLASSES_ROOT;
// internen Schlüsselnamen für diesen Dateityp
// ermitteln
if(reg.OpenKey(szExtension,false)) then
try
s := reg.ReadString('');
finally
reg.CloseKey;
end;
// den Hauptschlüssel (= Dateiendung) löschen
Result := (reg.DeleteKey(szExtension)) and
// den ermittelten internen Schlüssel ebenfalls löschen
(s <> '') and
(reg.KeyExists(s)) and
(reg.DeleteKey(s));
finally
reg.Free;
end;
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,nil,nil);
end;
end;
const
szKeyName = '%s\shell\%s';
function AddFileHandler(const szInternalName,
szHandlerName,
szHandlerDescription,
szCommandLine: string): boolean;
var
reg : TRegistry;
begin
Result := (IsAdmin) and
(szInternalName <> '') and
(szHandlerName <> '') and
(szCommandLine <> '');
// "szHandlerDescription" ist optional und wird
// nicht geprüft
if(Result) then
begin
reg := TRegistry.Create;
if(reg <> nil) then
try
reg.RootKey := HKEY_CLASSES_ROOT;
// der Schlüssel "szInternalName" muss existieren
if(reg.KeyExists(szInternalName)) then
begin
// dann wird ein entsprechender Unterschlüssel mit
// der gewünschten Aktion erzeugt
if(reg.OpenKey(Format(szKeyName + '\command',
[szInternalName,szHandlerName]),true)) then
try
// die angegebene "Kommandozeile" wird als
// Standard eingetragen
reg.WriteString('',szCommandLine);
Result := (reg.ReadString('') = szCommandLine);
finally
reg.CloseKey;
end;
// gibt es eine Beschreibung?
if(szHandlerDescription <> '') then
if(reg.OpenKey(Format(szKeyName,
[szInternalName,szHandlerName]),true)) then
try
reg.WriteString('',szHandlerDescription);
finally
reg.CloseKey;
end;
end;
finally
reg.Free;
end;
end;
end;
function DelFileHandler(const szInternalName,
szHandlerName : string): boolean;
var
reg : TRegistry;
begin
Result := (IsAdmin) and
(szInternalName <> '') and
(szHandlerName <> '');
if(Result) then
begin
reg := TRegistry.Create;
if(reg <> nil) then
try
reg.RootKey := HKEY_CLASSES_ROOT;
Result :=
(reg.KeyExists(Format(szKeyName,[szInternalName,szHandlerName]))) and
(reg.DeleteKey(Format(szKeyName,[szInternalName,szHandlerName])));
finally
reg.Free;
end;
end;
end;
function SetDefaultHandler(const szInternalName,
szDefaultHandler: string): boolean;
var
reg : TRegistry;
begin
Result := (IsAdmin) and
(szInternalName <> '') and
(szDefaultHandler <> '');
if(Result) then
begin
reg := TRegistry.Create;
if(reg <> nil) then
try
reg.RootKey := HKEY_CLASSES_ROOT;
if(reg.KeyExists(szInternalName)) and
(reg.OpenKey(szInternalName + '\shell',false)) then
try
reg.WriteString('',szDefaultHandler);
Result := (reg.ReadString('') = szDefaultHandler);
finally
reg.CloseKey;
end;
finally
reg.Free;
end;
end;
end;
[edit=Matze]Code formatiert. Mfg, Matze[/edit]
|