2010-06-06 68 views
3

到目前为止,如果我不得不将文件扩展名与我的应用程序相关联,那么我只是简单地修改注册表。但是我多年来一直没有这样做,恐怕事情可能会发生一些变化。我不知道如何防止Windows 7/Vista中的注册表访问限制(如果有任何HKEY_CLASSES_ROOT)。因此,我正在寻找一些德尔福图书馆,单位,代码片断或任何可以在XP,Vista和7下可靠工作的东西。 是否有任何处理“备份”的东西?通过备份我的意思是恢复到以前的协会的变化的可能性...将特定的文件扩展名与我的delphi应用程序相关联 - 任何用于此的库?

+0

直接使用注册表是管理shell文件扩展名的标准方式。而且这也不是特别困难... – 2010-06-06 12:22:29

+0

我知道这并不难,我只是怕在Vista和7中引入新的特权系统。 – migajek 2010-06-06 12:26:12

+0

不怕。但前提是你不在部署的应用程序中执行此操作。编辑文件关联 - 是应该安装应用程序的东西。安装程序以admin /抬头运行,所以它对HKLM的访问没有任何问题。它可以安装应用程序并注册它。你的应用程序本身不应该注册文件assoc。那么,如果你愿意,你可以做到。但为此使用HKCU。 – Alex 2010-06-06 16:50:15

回答

5

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

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

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

这将是可能的,但使用第三方组件完成此操作很尴尬。

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

+0

你知道'HKEY_CLASSES_ROOT'是'HKEY_CURRENT_USER'和'HKEY_LOCAL_MACHINE'中子键的组合,对吧?请参阅http://en.wikipedia.org/wiki/HKEY_CLASSES_ROOT#HKEY_CLASSES_ROOT_.28HKCR.29 – 2010-06-06 12:55:07

相关问题