Показать сообщение отдельно
  #1  
Старый 14.06.2010, 21:30
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка Файловые ассоциации - Не все так просто как кажется

Приветствую, помогите реализовать задачу: необходимо мою программу UnMaskFile добавить в контекстное меню всех файлов в системе, перерыл многое, в результате нашел, что якобы это реализуется через написание соответствующей библиотеки, так ли это и нет ли у кого примера?

Вот мой юнит, собранный на основе информации с форумов, для ассоциации программы с указанным типом:

Код:
unit Assoc;//Warning Assoc Replaced

interface

uses
  Registry, ShlObj, SysUtils, Windows;

function RegisterFileType(cMyExt, cMyFileType, cMyDescription, cMyText,
  ExeName: string; IcoIndex: integer; DoUpdate: boolean = True;
  cHKEY: HKEY = HKEY_CLASSES_ROOT): boolean;

procedure SimpleCreateAssoc(cMyExt, cMyText, ExeName: string);

implementation

// HKEY_LOCAL_MACHINE\Software\Classes
// HKEY_CURRENT_USER\Software\Classes -> for Vista & 7

function RegisterFileType(cMyExt, cMyFileType, cMyDescription, cMyText,
  ExeName: string; IcoIndex: integer; DoUpdate: boolean = True;
  cHKEY: HKEY = HKEY_CLASSES_ROOT): boolean;
var
  Reg: TRegistry;
  Ext: String;
begin
  RESULT := FALSE;
  //
  Reg := TRegistry.Create;
  try
    Reg.RootKey := cHKEY;
    //
    Ext := cMyExt;
    if Ext[1] <> '*' then
    begin
      if Ext[1] <> '.' then
        Ext := '.' + Ext;
    end;
    //
    if (cHKEY = HKEY_LOCAL_MACHINE) or (cHKEY = HKEY_CURRENT_USER) then
    Ext := 'Software\Classes\' + Ext;
    //
    if Reg.OpenKey(Ext, True) then
    begin
      Reg.WriteString('', cMyFileType); // ExeFile or EXE.MyApp
      Reg.CloseKey;
    end;
    //
    if Reg.OpenKey(cMyFileType, True) then
    begin
      Reg.WriteString('', cMyDescription);
      Reg.CloseKey;
    end;
    //
    if Reg.OpenKey(cMyFileType + '\DefaultIcon', True) then
    begin
      Reg.WriteString('', AnsiQuotedStr(ExeName, '"') + ',' + IntToStr(IcoIndex)
        );
      // or:
      // Reg.WriteString('', AnsiQuotedStr(ExeName + ',' + IntToStr(IcoIndex), '"'));
      Reg.CloseKey;
    end;
    //
    if Reg.OpenKey(cMyFileType + '\Shell\Open', True) then
    begin
      Reg.WriteString('', cMyText); // &Open
      Reg.CloseKey;
    end;
    //
    if Reg.OpenKey(cMyFileType + '\Shell\Open\Command', True) then
    begin
      Reg.WriteString('', AnsiQuotedStr(ExeName, '"') + ' "%1"');
      Reg.CloseKey;
      RESULT := True;
    end;
    //
    if DoUpdate then
      SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
    //
  finally
    Reg.Free;
  end;
end;

procedure SimpleCreateAssoc(cMyExt, cMyText, ExeName: string);
begin
RegisterFileType(cMyExt, cMyExt + 'file', '', cMyText,
  ExeName, 0, True, HKEY_CLASSES_ROOT);
RegisterFileType(cMyExt, cMyExt + 'file', '', cMyText,
  ExeName, 0, True, HKEY_LOCAL_MACHINE);
RegisterFileType(cMyExt, cMyExt + 'file', '', cMyText,
  ExeName, 0, True, HKEY_CURRENT_USER);
end;

end.
Ответить с цитированием