Свяжите определенные расширения файлов с моим приложением delphi - какая-нибудь библиотека для этого?

До сих пор, если мне приходилось связывать расширение файла с моим приложением, я просто изменял реестр. Однако я не делал этого годами и боюсь, что все могло немного измениться. Понятия не имею, как предотвратить ограничения доступа к реестру в Windows 7 / Vista (если они есть для HKEY_CLASSES_ROOT). Таким образом, я ищу какую-нибудь библиотеку delphi, модуль, фрагмент кода или что-то еще, что надежно работает под XP, Vista и 7. Есть ли что-нибудь, что также обрабатывает "резервное копирование"? Под резервным копированием я подразумеваю возможность вернуть изменения к предыдущей ассоциации ...


person migajek    schedule 06.06.2010    source источник
comment
Работа напрямую с реестром - это стандартный способ управления расширениями файлов оболочки. И это тоже не особо сложно ...   -  person Andreas Rejbrand    schedule 06.06.2010
comment
Я знаю, что это несложно, просто боюсь новой системы привилегий, представленной в Vista и 7.   -  person migajek    schedule 06.06.2010
comment
Не боюсь. Но только если вы этого не сделаете в развернутом приложении. Редактирование ассоциаций файлов - это то, чем должен заниматься установщик вашего приложения. Установщик работает с администратором / повышенными правами, поэтому у него нет проблем с доступом к HKLM. Он может установить приложение и зарегистрировать его. Само ваше приложение не должно регистрировать файл assoc. Что ж, вы можете это сделать, если хотите. Но используйте для этого HKCU.   -  person Alex    schedule 06.06.2010


Ответы (1)


Я бы не рекомендовал использовать для этого сторонний компонент, так как это только усложнит ситуацию.

Все мы знаем, как создавать ассоциации файлов, редактируя кусты HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE, верно? В Windows Vista + редактирование первого не вызывает никаких проблем, но если вы по какой-то причине хотите отредактировать последнее, то есть если вы хотите отредактировать ассоциации для всех пользователей на машине, тогда ваше приложение должно запускаться с повышенными привилегиями.

Чтобы запустить приложение с повышенными привилегиями, пользователь может щелкнуть значок правой кнопкой мыши и выбрать «Запуск от имени администратора». Но это уродливо. Однако можно запустить приложение от имени администратора автоматически, просто добавив манифест (файл XML) в ресурс приложения. После этого при запуске файла * .exe автоматически появится приглашение UAC, независимо от того, как конечный пользователь запустит программу, и программа будет запущена от имени администратора и сможет полностью изменить куст HKEY_LOCAL_MACHINE. Подробная информация о том, как добавить этот манифест, была объяснена в нескольких вопросах SO. Это действительно просто.

Насколько мне известно, работающее приложение не может «обновить» свои привилегии во время выполнения. Итак, если у вас есть кнопка в вашем приложении, работающая с обычными привилегиями, вы не можете сделать что-то вроде этого:

procedure Button1.Click(Sender: TObject);
begin
  SomehowGetAdminPrivileges;
  ChangeLocalMachineRegistry;
  SomehowGetBackNormalPrivileges;
end;

Это просто невозможно. Поэтому, если вам нужно сделать что-то, что требует прав администратора во время выполнения, вам нужно вызвать внешнее приложение, как в

procedure Button1.Click(Sender: TObject);
begin
  ShellExecute(Application.Handle, nil, PChar('myapp.exe'), nil, nil, SW_SHOWNORMAL);
end;

myapp.exe должен иметь манифест, чтобы он работал с повышенными привилегиями и мог делать то, что вы хотите. Но желательно, чтобы у myapp.exe не было графического интерфейса - когда пользователь нажимает кнопку, появляется приглашение UAC, и myapp.exe выполняет изменение реестра, а затем завершает свою работу.

Было бы возможно, но неудобно сделать это с помощью стороннего компонента.

Вам нужно изменить реестр во время установки? Если вы используете Inno Setup, профессиональный бесплатный инструмент, Inno Setup будет включать манифест за вас. Следовательно, приглашение UAC появится при запуске setup.exe (скомпилированного с помощью Inno Setup), если этого требует установка, например если установка внесет какие-либо изменения в HKEY_LOCAL_MACHINE.

person Andreas Rejbrand    schedule 06.06.2010
comment
Вы ведь знаете, что HKEY_CLASSES_ROOT - это комбинация подключей в HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE, верно? См. en.wikipedia.org/wiki/ - person Andreas Rejbrand; 06.06.2010