delphi - 将特定的文件扩展名与我的delphi应用程序关联 - 有任何库吗?

标签 delphi windows-xp file-extension file-association

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

最佳答案

我建议不要为此使用第 3 方组件,因为它只会使事情变得更加复杂。

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

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

使用第三方组件来完成此任务是可能的,但很尴尬。

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

关于delphi - 将特定的文件扩展名与我的delphi应用程序关联 - 有任何库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2984117/

相关文章:

delphi - Delphi 内置组件中的滚动条有问题

delphi - Delphi中AsInteger和Value有什么区别?

delphi - Delphi 的 $WARN 编译器指令的标识符

windows - 是否可以在没有管理员权限的情况下在 Windows XP 上运行 Oracle?

windows-xp - Windows XP 中的用户帐户图标/图片存储在哪里? (显示在非经典登录/欢迎屏幕上的内容。)

c# - c#中没有扩展名时如何检查文件类型

delphi - 在设计模式下排除运行时异常

windows - 如何确定计算机是否运行 XP Service pack 3

android - Android 中的自定义文件扩展名

c# - 从 Content-Type 获取扩展