3

到目前为止,如果我必须将文件扩展名与我的应用程序相关联,我曾经只是简单地修改注册表。但是我已经很多年没有这样做了,我担心事情可能会有所改变。我不知道如何防止 Windows 7 / Vista 中的注册表访问限制(如果有 HKEY_CLASSES_ROOT 的话)。因此,我正在寻找一些在 XP、Vista 和 7 下可靠运行的 delphi 库、单元、代码片段或任何东西。是否也有处理“备份”的东西?通过备份,我的意思是可以将更改恢复到以前的关联......

4

1 回答 1

5

我建议不要为此使用 3rd-party 组件,因为它只会让事情变得更复杂。

我们都知道如何通过编辑HKEY_CURRENT_USER和配置单元来建立文件关联HKEY_LOCAL_MACHINE,对吧?在 Windows Vista+ 中,编辑前者意味着没有问题,但如果您出于某种原因想要编辑后者,即,如果您想要编辑机器上所有用户的关联,那么您的应用程序需要以提升的权限运行。

要使应用程序以提升的权限运行,用户可以右键单击该图标并选择“以管理员身份运行”。但这很丑陋。但是,只需将清单(XML 文件)添加到应用程序的资源中,就可以使应用程序自动以管理员身份运行。然后UAC提示符会在执行*.exe文件时自动弹出,无论最终用户如何启动程序,程序都会以管理员身份运行,完全可以修改HKEY_LOCAL_MACHINEhive。有关如何添加此清单的详细信息已在几个 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 不应该有 GUI - 当用户单击按钮时,会出现 UAC 提示,并且 myapp.exe 执行注册表更改然后终止。

使用 3rd-party 组件来实现这一点是可能的,但很尴尬。

安装过程中是否需要更改注册表?如果您使用专业且免费工具 Inno Setup,Inno Setup 将为您包含清单。因此,如果安装程序需要 UAC 提示符,将在启动 setup.exe(使用 Inno Setup 编译)时出现,例如,如果安装程序将对HKEY_LOCAL_MACHINE.

于 2010-06-06T12:52:58.260 回答