1. Регистрация приложения

Используйте класс TRegistry (в uses нужно подключить модуль Registry) или соответствующие функции Win API. В HKEY_CLASSES_ROOT добавьте раздел 'Applications\yourprogram.exe\Shell\Open\Command\Path, %1'. При вызове программы в %1 система подставляет имя открываемого файла. Его можно извлечь из командной строки например с помощью функции ParamStr(1).



2. Регистрация расширения

Чтобы зарегистрировать свое расширение, нужно прописать его в HKEY_CLASSES_ROOT. В примере регистрируется расширение blabla и устанавливается связь файлов этого типа с программой programname. В переменной programname должен содержаться полный путь до исполняемого файла.

  Reg := TRegistry.Create;
  Ext := 'blablabla';
  Reg.RootKey := HKEY_CLASSES_ROOT;
  Reg.OpenKey('.' + Ext, true);
  Reg.WriteString('','Описание файлов blabla');
  Reg.CloseKey;
  Reg.OpenKey('DefaultIcon', true);
  Reg.WriteString('', programname + ', 0');		

  //0 - индекс иконки (иконка приложения). 
  //Зашейте в экзешник ещё одну, специально для 
  //файлов этого типа и укажите индекс 1 вместо 0.

  Reg.CloseKey;
  Reg.OpenKey('.' + Ext + '\shell\open\command', true);
  Reg.WriteString('', programname + ' "%1"');		
  //связывание типа файла с вашим приложением.


3. Прописка в выпадающем списке "Открыть с помощью ->"

Иногда может быть так, что программа не должна связываться с каким-либо типом файла напрямую. Например, лучшее средство web-дизайнера Notepad.exe и файлы html. Обычно для этого люди выбирают нужную программу из списка "Открыть с помощью...", при этом убирают галочку "Использовать её для всех файлов такого типа", и, вуаля, она появляется в подменю "Открыть с помошью ->". Как совершить эти манипуляции программно?

В разделе реестра HKEY_CURRENT_USER есть ключ 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts', его подключами являются расширения файлов:

Для каждого расширения существует подключ OpenWithList, где хранятся параметры вида

Нужно дописать ещё один параметр, имя которого должно быть следующей по алфавиту буквой после уже использованных, а значение - название вашей программы. Также необходимо дописать вашу букву в параметр MRUList. Порядок следования букв в этом параметре значения не имеет, но ваша буква должна следовать непосредственно за уже существующими, т.е. если сюда записать параметр под именем 'z', то ничего не получится (пробовал :) ). В следующем примере представлена функция, добавляющая программу programname в OpenList файла с расширением ext:

  procedure LinkWith(ext: string; progname: string);
  var
    i: integer;
    MRU: string;
    vl: TStringList;
  begin
    Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + 
      ext + '\OpenWithList', true);

    vl := TStringList.Create;
    Reg.GetValueNames(vl);		

    for i := 0 to vl.Count-1 do      
      if (Reg.GetDataType(vl[i]) = rdString) then
        if Reg.ReadString(vl[i]) = progname then 
        begin  
          //программа уже ассоциирована с этим типом файла
          Reg.CloseKey;
          Exit;
        end;
    
    vl.Destroy;

    if Reg.ValueExists('MRUList') then  
    begin
      MRU := Reg.ReadString('MRUList');
      if Length(MRU) > 0 then
        for i := 0 to Length(MRU)-1 do
          //ищем первую по алфавиту незанятую букву (которой нет в MRU):
          if Pos(Char(i + 97), MRU) < 0 then break;
    end
    else begin
      MRU := '';
      i := 0;
    end;

    Reg.WriteString(Char(i + 97), progname);
    MRU := MRU + Char(i + 97);
    Reg.WriteString('MRUList', MRU);
    Reg.CloseKey;
  end;

PS: в принципе, в переменной MRUList могут содержаться буквы, не имеющие связи ни с какими параметрами (см. третий рисунок), или программы, указанные в списке OpenWithList, могут быть уже давно удалены. Но это не важно. От вас требуется только дописать свою букву. А для чистки реестра воспользуйтесь соответствующими программами.

©MiZa