我有一个应用程序将程序设置写入Windows注册表是绝对必要的。存储到文件不是一个选项。
为了简化这一点,我想提供一个“管理员权限”唠叨屏幕,而不是试图解释如何右键单击程序文件/捷径。
我找到了一篇相当不错的文章,但是在为清单添加自己的资源文件后,我收到了重复的资源错误。
这应该是由于与内部清单冲突并解决问题我看到很多评论建议在项目选项中禁用“启用运行时主题”。我已经浏览了所有菜单,但找不到它,我现在被告知它可能在Delphi 7中不可用并且在以后的版本中引入。
我如何添加自己的清单?
我已经评论过“将程序设置写入注册表并不是给予应用程序管理员权限的正当理由”。但是,在任何情况下都包含UAC清单是个好主意。常见的Kobik's answer应该是requestedExecutionLevel
。 level="asInvoker"
see the docs
创建以下4个文件(2套):
(仅限UAC)
uac.manifest
"Q: Adding manifest for admin rights request for delphi 7"
uac.rc
<?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
1 24 "uac.manifest"
uac_xp.rc
<?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"
文件(rc
或uac.rc
)添加到项目中。这将在您的项目文件中创建uac_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.
。 Delphi会自动将{$R 'uac_xp.res' 'uac_xp.rc'}
编译为rc
文件。
或者,您可以通过Delphi IDE外部的res
编译rc
文件。然后手动将brcc32 uac.rc
添加到您的项目中。
确保您不使用任何其他XP清单。
如何从Delphi 7项目中删除“内部”清单?
该内部清单在德尔福7次由{$R 'uac_xp.res'}
组件表示,其唯一目的是将TXPManifest
单元添加到表单单元的使用条款中。然后,这个XPMan.pas
单元将包含清单本身的资源文件包含在项目输出中。
因此,要删除此内部清单,您需要从项目的所有形式中删除所有XPMan.pas
组件(如果您使用它们),以及项目所有单元中的所有TXPManifest
使用子句引用。
简而言之,对项目的所有单元执行以下两个步骤(如果未使用XPMan
组件,则第一步是可选的,但第二步是可选的):