Связать определенные расширения файлов с моим приложением delphi - есть ли библиотека для этого? - PullRequest
3 голосов
/ 06 июня 2010

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

1 Ответ

5 голосов
/ 06 июня 2010

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

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

Чтобы приложение запускалось с повышенными правами, пользователь может щелкнуть правой кнопкой мыши значок и выбрать «Запуск от имени администратора». Но это безобразно. Однако можно заставить приложение автоматически запускаться от имени администратора, просто добавив манифест (файл XML) к ресурсу приложения. Затем приглашение UAC автоматически появится после выполнения файла * .exe, независимо от того, как конечный пользователь запустит программу, и программа запустится от имени администратора и вполне сможет изменить куст 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.

...