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

Posted

技术标签:

【中文标题】将特定的文件扩展名与我的 delphi 应用程序相关联 - 有任何库吗?【英文标题】:Associate specific file extensions with my delphi app - any library for this? 【发布时间】:2011-02-28 08:56:45 【问题描述】:

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

【问题讨论】:

直接使用注册表是管理 shell 文件扩展名的标准方式。而且也不是特别难…… 我知道不难,就是怕Vista和7引入的新权限系统。 不怕。但前提是您不在已部署的应用程序中执行此操作。编辑文件关联 - 是您的应用程序安装程序应该做的事情。安装程序以 admin/elevated 运行,因此 HKLM 的访问没有问题。它可以安装应用程序并注册它。您的应用程序本身不应注册文件关联。好吧,如果你愿意,你可以做到。但是为此使用 HKCU。 【参考方案1】:

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

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

要使应用程序以提升的权限运行,用户可以右键单击图标并选择“以管理员身份运行”。但这很丑陋。但是,只需将清单(XML 文件)添加到应用程序的资源中,就可以使应用程序自动以管理员身份运行。然后UAC提示符会在执行*.exe文件时自动弹出,无论最终用户如何启动程序,程序都会以管理员身份运行,完全可以修改HKEY_LOCAL_MACHINE hive。有关如何添加此清单的详细信息已在几个 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 将为您包含清单。因此,如果安装程序需要,启动 setup.exe(使用 Inno Setup 编译)时会出现 UAC 提示,例如如果设置将对HKEY_LOCAL_MACHINE 进行任何更改。

【讨论】:

您知道HKEY_CLASSES_ROOTHKEY_CURRENT_USERHKEY_LOCAL_MACHINE 中子键的“组合”,对吧?见en.wikipedia.org/wiki/…

以上是关于将特定的文件扩展名与我的 delphi 应用程序相关联 - 有任何库吗?的主要内容,如果未能解决你的问题,请参考以下文章

禁用快速查看

Windows 7文件扩展名关联

将文件扩展名与应用程序关联

如何将我的域名与我的 AWS 应用程序相关联?

将文件类型与我的 Iphone 应用程序关联

如何将苹果付款通知与我的自定义付款记录相关联?