Используйте класс TRegistry (в uses нужно подключить модуль Registry) или соответствующие функции Win API. В HKEY_CLASSES_ROOT добавьте раздел 'Applications\yourprogram.exe\Shell\Open\Command\Path, %1'. При вызове программы в %1 система подставляет имя открываемого файла. Его можно извлечь из командной строки например с помощью функции ParamStr(1).
Чтобы зарегистрировать свое расширение, нужно прописать его в 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"'); //связывание типа файла с вашим приложением.
Иногда может быть так, что программа не должна связываться с каким-либо типом файла напрямую. Например, лучшее средство 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