Delphi 正在为管理员权限请求添加清单
我有一个将程序设置写入windows注册表的应用程序,这是绝对必要的。因此,存储到文件不是一个选项 为了简化这一点,我想给一个“管理员权限”的唠叨屏幕,而不是试图解释如何右键单击程序文件/快捷方式 我发现了一篇相当不错的文章,但在为清单添加了自己的资源文件后,我收到了一个重复的资源错误 这可能是由于与内部清单的冲突,为了解决这个问题,我看到很多评论建议在项目选项中禁用“启用运行时主题”。我浏览了每一个菜单,但找不到它,现在有人告诉我,它可能在Delphi7中不可用,并在以后的版本中引入 如何添加自己的清单?如何从Delphi 7项目中删除“内部”清单? 该内部清单在Delphi中被Delphi 正在为管理员权限请求添加清单,delphi,delphi-7,manifest,administrator,Delphi,Delphi 7,Manifest,Administrator,我有一个将程序设置写入windows注册表的应用程序,这是绝对必要的。因此,存储到文件不是一个选项 为了简化这一点,我想给一个“管理员权限”的唠叨屏幕,而不是试图解释如何右键单击程序文件/快捷方式 我发现了一篇相当不错的文章,但在为清单添加了自己的资源文件后,我收到了一个重复的资源错误 这可能是由于与内部清单的冲突,为了解决这个问题,我看到很多评论建议在项目选项中禁用“启用运行时主题”。我浏览了每一个菜单,但找不到它,现在有人告诉我,它可能在Delphi7中不可用,并在以后的版本中引入 如何添加
TXPManifest
组件表示了7次,其唯一目的是将XPMan.pas
单元添加到表单单元的uses子句中,该单元被丢弃。然后,这个XPMan.pas
单元将资源文件和清单本身包含在项目输出中
因此,要删除此内部清单,您需要从项目的所有表单(如果使用)中删除所有txpmaniest
组件,以及从项目的所有单元中删除所有XPMan
uses子句引用
简言之,对项目的所有单元执行以下两个步骤(如果未使用TXPManifest
组件,则第一个步骤是可选的,但第二个步骤是可选的):
我已经说过“将程序设置写入注册表不是授予应用程序管理员权限的正当理由”。不过,在任何情况下都最好包含UAC清单。常见的
requestedExecutionLevel
应该是level=“asInvoker”
创建以下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+XP主题) uac_xp.manifest
通过“项目>添加到项目”菜单项将所需的
rc
文件(uac.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将自动将rc
编译为res
文件
或者,您可以通过DelphiIDE外部的brcc32 uac.rc
编译rc
文件。然后手动将{$R'uac_xp.res'}
添加到项目中
确保不使用任何其他XP清单。在较新版本的Delphi中,不再需要此清单。
在“项目选项”和“应用程序”下,有一个清单部分:
东京10.2.1版截图 这将自动处理XP清单,该清单在的底部作为警告提到 我不知道这是从哪个Delphi版本获得的。
(如果您知道,可以自由编辑此答案)。
(编辑Ian Murphy 2019年2月:在XE2中不可用)将程序设置写入注册表不是授予应用程序管理员权限的正当理由!这是一个非常糟糕的主意。人们确实想知道为什么你不做其他开发人员都做的事情,并将程序设置写入正确的位置。我正在将它们写入Hkey current user,从我阅读的内容来看,它应该可以在没有管理员的情况下写入。写入HKCU不需要管理员权限。那么为什么你需要成为一个呢?您仍然需要包含UAC清单,但带有
level=“asInvoker”
,这可能不会改变dup资源的问题。正确。正如你可能知道的,这是我的第一次显式尝试。我选择admin的原因是因为我知道它是有效的。一旦我有了工作,我就可以专注于清单和不同的级别,并对其进行微调。在任何表单上都没有Xpmanifest组件或Xpman声明。这只是向应用程序添加清单的一种方法(我想说是Delphi 7中的常用方法)。因此,如果这没有帮助,请尝试像以前一样在整个项目中搜索所有包含的资源{$R ResourceFileName.res}
。可以有一个,其中包括清单(资源文件的名称可以是任意的)。与使用ide在项目中添加资源相比,添加资源的方法似乎解决了这个问题。我听到了你关于管理的说法,但我现在可以使用设置来查看哪些是允许的,哪些是不允许的。@Redshift,关于你的编辑:注意{$R'uac_xp.res''uac_xp.rc'}
。Delphi将自动将rc
编译为res
文件,因此无需通过brcc32 uac.rc
编译rc
文件。如果仅使用{$R'uac_xp.res'}
则需要在Delphi IDE.FYI之外编译rc
文件,在现代Delphi版本中,可以直接在项目选项中指定自定义.manifest文件的路径,而不是使用.rc/.res文件。请参阅“启用运行时主题”以“自定义清单”.对Embarcadero docwiki URL的轻微更正--您可以(今天)在此处查看有关Delphi XE7应用程序选项的信息:
1 24 "uac.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>
1 24 "uac_xp.manifest"
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.