В основном вам необходимо добавить два ключа в улей регистра HKEY_CLASSES_ROOT. Зарегистрируете в корне ваше расширение типа ".ext" (создаете ключ с именем расширения):
HKEY_CLASSES_ROOT\ .ext\ |
и запишите в строке "default" созданного ключа "внутреннее имя" вашего типа файлов - например, MyApp.Document:
HKEY_CLASSES_ROOT\ .ext\ Default = "MyApp.Document" |
Затем создайте другой ключ с этим именем:
HKEY_CLASSES_ROOT\ MyApp.Document\ |
Создайте подключ с именем "shell", в нем другой подключ с именем "open" и в "open", в свою очередь, еще один подключ с именем "command". Значение по умолчанию (default) - путь и имя вашего приложению с ключом "%1", представляющим параметр "имя файла", позволяя системе подставлять подставлять вызванный файл:
HKEY_CLASSES_ROOT\ MyApp.Document\ shell\ open\ command\ Default = "C:\myapp\myapp.exe %1" |
Все манипуляции в коде производятся с помощью объекта TRegistry или при использовании InstallShield, который сделает это за вас автоматически. Я должен посоветовать вам использовать оба пути, поскольку пользователь может внести в регистры всякий мусор.
Вот еще один совет:
Самый простой путь достижения цели - модифицировать секцию Extensions в win.ini-файле, расположенном с директории Windows. Это также работает под Win 95, автоматически обновляя регистры при перезапуске системы. Взгляните на секцию Extensions win.ini-файла для определения формата записи. Поместите IniFiles в секцию используемых модулей и создайте код подобно этому:
var INIFile: TIniFile; begin try INIFile := TInifile.Create('WIN.INI'); INIFile.WriteString('Extensions','txt','c:\windows\notepad.exe ^.txt'); finally INIFile.Free; end; end; |
Это ассоциирует файлы с расширением *.txt с Записной Книжкой (Notepad) Windows. Например, для ассоциации вашего приложения MyApp с каталогом расположения c:\MyApps с файлами, имеющими расширение *.MAP, необходимо выполнить следующее:
var INIFile: TIniFile; begin try INIFile := TInifile.Create('WIN.INI'); INIFile.WriteString('Extensions','map','c:\myapps\myapp.exe ^.map'); finally INIFile.Free; end; end; |
Это будет работать как в Win 3.11, так и в Win 95 и избавит вас от работы с регистрами в Win 95. Не уверен насчет Win NT (или Win98), поскольку у меня нет возможности протестировать это дома. Имейте в виду, что все вышеописанное - только часть проблемы, т.к. приложение после всех вышеуказанных манипуляций еще должно этот файл открыть. Для этого вы должны прочесть ParamStr(1), содержащий полный путь к файлу, выбранному пользователем, и должным образом загрузить его в свое приложение.
Дополнение
Михаил Шпанер продолжает эту тему:
Чтобы описание типа файлов появилось в списке "Типы файлов" Windows 98, укажите в параметре "default" ключа 'HKEY_CLASSES_ROOT\MyApp.Document\' краткое описание типа файлов (файл My App).
Чтобы ассоциированные файлы имели соответствующую приложению иконку, нужно в параметре "default" ключа 'HKEY_CLASSES_ROOT\ MyApp.Document\DefaultIcon\' указать путь к иконке. Иконки соответствующих файлов обновятся после перезагрузки Windows. Windows 98 делает это без перезагрузки системы, но как это сделать я не знаю, может быть кто-то подскажет.
Пример кода (проверено в Delphi5, Windows98):
Добавьте 'Registry' в строку Uses.
Объявите переменную 'RegFile':
var RegFile : TRegIniFile; begin RegFile:=TRegIniFile.Create; RegFile.RootKey:=HKEY_CLASSES_ROOT; //устанвливаем текущий ключ RegFile.WriteString('.ext','','MyApp.Document'); // определяем расширение RegFile.WriteString('MyApp.Document','','Описание файлов');//Описание ассоциированных файлов (для списка "Типы файлов" Windows 98). RegFile.WriteString('MyApp.Document \DefaultIcon','','Путь к иконе для файлов');//устанавливаем икону для ассоциированных файлов //Исполняемый файл (полный путь) RegFile.WriteString(' MyApp.Document \Shell\Open\Command','','исполняемый файл "%1" '); RegFile.CloseKey; RegFile.Free; End; |
С уважением Михаил Шпанер.
Дополнение
Michael Ribnitski дополняет:
Для того, чтобы иконки соответствующих файлов обновились без перезагрузки Windows:
uses ShlObj; ...... SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, NiL, NiL); |
[000291]