Einzelnen Beitrag anzeigen

Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#1

Dateiendungen registrieren

  Alt 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]
  Mit Zitat antworten Zitat