До сих пор, если мне приходилось связывать расширение файла с моим приложением, я просто изменял реестр. Однако я не делал этого годами и боюсь, что все могло немного измениться. Понятия не имею, как предотвратить ограничения доступа к реестру в Windows 7 / Vista (если они есть для HKEY_CLASSES_ROOT). Таким образом, я ищу какую-нибудь библиотеку delphi, модуль, фрагмент кода или что-то еще, что надежно работает под XP, Vista и 7. Есть ли что-нибудь, что также обрабатывает "резервное копирование"? Под резервным копированием я подразумеваю возможность вернуть изменения к предыдущей ассоциации ...
Свяжите определенные расширения файлов с моим приложением delphi - какая-нибудь библиотека для этого?
Ответы (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
.
HKEY_CLASSES_ROOT
- это комбинация подключей в HKEY_CURRENT_USER
и HKEY_LOCAL_MACHINE
, верно? См. en.wikipedia.org/wiki/
- person Andreas Rejbrand; 06.06.2010