2013-02-05 45 views
6

我有一个程序设置写入Windows注册表的绝对必要的应用程序,因此存储到文件不是一个选项。为管理权限请求添加清单

为了简化这一点,我想给一个“管理员权限”的唠叨屏幕,而不是试图解释如何右键点击程序文件/快捷方式。

我发现了一篇相当不错的文章,但是在为清单添加我自己的资源文件后,我收到了重复的资源错误。

这应该是由于与内部清单冲突,并解决问题,我看到很多意见建议“启用运行时主题”在项目选项中被禁用。我已经浏览了所有菜单,但找不到它,现在我被告知它可能在Delphi 7中不可用,并在更高版本中引入。

如何添加我自己的清单?

+4

将程序设置写入注册表并不是给您的应用程序管理员权限的正确原因!这是一个非常糟糕的主意。 – kobik

+1

人们不知道为什么你不做其他开发人员所做的,并将程序设置写入正确的位置。 –

+0

我正在将它们写入Hkey当前用户,从我阅读的内容来看,它应该可以在没有管理员的情况下写入。 – Clinton

回答

22

我已经评论说:“将程序设置写入注册表不是给予您应用程序管理权限的正确原因”。不过,在任何情况下都包含UAC清单是一个好主意。常见的requestedExecutionLevel应该是level="asInvoker"see the docs

"Q: Adding manifest for admin rights request for delphi 7" 

创建以下4个文件(2台):


(UAC只)

uac.manifest

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="MyApp" type="win32"/> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 

uac。RC

1 24 "uac.manifest" 

(UAC + XP主题)

uac_xp.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity type="win32" name="MyApp" version="1.0.0.0" processorArchitecture="x86"/> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
     type="win32" 
     name="Microsoft.Windows.Common-Controls" 
     version="6.0.0.0" 
     publicKeyToken="6595b64144ccf1df" 
     language="*" 
     processorArchitecture="*"/> 
    </dependentAssembly> 
    </dependency> 
    <!-- Windows Vista application security requirements. --> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel 
      level="requireAdministrator" 
      uiAccess="false"/> 
     </requestedPrivileges> 
     </security> 
    </trustInfo> 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
     <!--Windows 7--> 
     <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> 
     <!--Windows Vista--> 
     <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
    </application> 
    </compatibility> 
</assembly> 

uac_xp.rc

1 24 "uac_xp.manifest" 

通过所需rc文件(uac.rcuac_xp.rc)添加到您的项目 “项目>添加到项目” 菜单项。这将在您的项目文件中创建的{$R}指令:

program Project1; 

{.$R 'uac.res' 'uac.rc'} // UAC only 
// OR 
{$R 'uac_xp.res' 'uac_xp.rc'} // UAC + XP Themes 

uses 
    Forms, 
    Unit1 in 'Unit1.pas' {Form1}; 

{$R *.RES} 

begin 
    Application.Initialize; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 

注意{$R 'uac_xp.res' 'uac_xp.rc'}。 Delphi会自动编译rcres文件。

或者,您可以通过Delphi IDE外的brcc32 uac.rc编译rc文件。然后手动将{$R 'uac_xp.res'}添加到您的项目中。


请确保您不使用任何其他XP清单。

+1

看来你的方法增加资源似乎解决了问题相比,使用IDE添加项目中的资源。我听到您对管理员的评论,但我现在可以使用设置来查看允许和不允许的内容。 – Clinton

+2

@Redshift,关于你的编辑:请注意'{$ R'uac_xp.res''uac_xp.rc'}'。 Delphi会自动将'rc'编译为'res'文件,所以不需要通过'brcc32 uac.rc'编译'rc'文件。如果你使用'{$ R'uac_xp.res'}',那么你需要在Delphi IDE之外编译'rc'文件。 – kobik

+0

仅供参考,在现代Delphi版本中,您可以直接在Project Options中指定自定义.manifest文件的路径,而不是使用.rc/.res文件。 –

11

如何从Delphi 7项目中删除“内部”清单?

内部清单是在Delphi由TXPManifest部件,其唯一目的是把XPMan.pas单元添加到其中它已被删除表格的单元的uses子句表示7次。然后这个XPMan.pas单元将具有清单本身的资源文件包括到项目输出中。

因此,要消除这种内部清单,你需要从所有的项目的形式(如果使用它们)删除所有TXPManifest组件,以及所有的XPMan使用从各单位条款引用您的项目。

总之,做以下两个步骤为你的项目的所有单位(第一步骤是可选的,如果你没有使用TXPManifest成分,但第二个):

enter image description here

+0

没有任何表单上的Xpmanifest compoent或Xpman声明。 – Clinton

+0

这只是一个(在Delphi 7中常见的方式,我会说)如何向应用程序添加清单。因此,如果没有帮助,请尝试像以前一样在整个项目中搜索所有包含的资源'{$ R ResourceFileName.res}'。可以有一个,其中包括清单(资源文件的名称可以是任何)。 – TLama

0

在Delphi的新版本中,这不再是必需的。
项目选项,然后应用,有一个清单的一部分:

Manifest options
从10.2.1版本东京

此自动维护XP截图舱单提到作为Kobik's answer的警告。

我不知道从哪个Delphi版本可用。
(如果您知道,可免费编辑此答案)。