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

mig*_*jek 3 delphi file-extension windows-xp file-association

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

And*_*and 5

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

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

要使应用程序以提升的权限运行,用户可以右键单击该图标并选择"以管理员身份运行".但那很难看.但是,可以通过向应用程序的资源添加清单(XML文件),使应用程序自动以管理员身份运行.然后,无论最终用户如何启动程序,UAC提示将在执行*.exe文件时自动弹出,程序将以管理员身份运行,并且完全能够更改HKEY_LOCAL_MACHINE配置单元.有关如何添加此清单的详细信息已在几个SO问题中进行了解释.这真的很容易.

据我所知,正在运行的应用程序无法在运行时"升级"其权限.因此,如果您的应用中有一个按钮,以正常权限运行,则无法执行以下操作:

procedure Button1.Click(Sender: TObject);
begin
  SomehowGetAdminPrivileges;
  ChangeLocalMachineRegistry;
  SomehowGetBackNormalPrivileges;
end;
Run Code Online (Sandbox Code Playgroud)

这根本不可能.因此,如果您需要在运行时执行需要管理员权限的操作,则需要调用外部应用程序,如

procedure Button1.Click(Sender: TObject);
begin
  ShellExecute(Application.Handle, nil, PChar('myapp.exe'), nil, nil, SW_SHOWNORMAL);
end;
Run Code Online (Sandbox Code Playgroud)

myapp.exe需要有一个清单,以便它可以使用提升的权限运行,并且能够执行您想要的操作.但最好是myapp.exe不应该有GUI - 当用户单击该按钮时,会出现UAC提示,并且myapp.exe执行注册表更改然后终止.

使用第三方组件实现这一点是很有可能的.

您是否需要在安装过程中更改注册表?如果你使用Inno Setup的,专业和免费工具,Inno Setup的将包括对你的清单.因此,如果设置需要,启动setup.exe(使用Inno Setup编译)时将出现UAC提示,例如,如果安装程序将进行任何更改HKEY_LOCAL_MACHINE.