delphi 正在为管理员权限请求添加清单

jgwigjjp  于 2023-05-17  发布在  其他
关注(0)|答案(3)|浏览(198)

我有一个应用程序,将程序设置写入Windows注册表,这是绝对必要的。存储到文件不是一个选项。
为了简化这一点,我想给予一个“管理员权限”唠叨屏幕,而不是试图解释如何右键单击程序文件/捷径。
我找到了一篇相当不错的文章,但在为清单添加自己的资源文件后,我收到了重复的资源错误。
这可能是由于与内部清单的冲突,为了解决这个问题,我看到很多评论建议在项目选项中禁用“启用运行时主题”。我已经通过了每一个菜单,但找不到它,我现在被告知,它可能不会在 Delphi 7,并在以后的版本中引入。
如何添加我自己的清单?

eeq64g8w

eeq64g8w1#

我已经评论过“将程序设置写入注册表不是给予应用程序管理员权限的适当理由”。但是,在任何情况下,包括UAC清单都是一个好主意。公共requestedExecutionLevel应该是level="asInvoker"see the docs

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

创建以下4个文件(2组):
(UAC仅)

uac.清单

<?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

(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

通过“项目>添加到项目”菜单项将所需的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清单。

kd3sttzy

kd3sttzy2#

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

这个 * 内部清单 * 在 Delphi 中被TXPManifest组件表示了7次,其唯一目的是将XPMan.pas单元添加到表单单元的uses子句中。然后,这个XPMan.pas单元将资源文件和清单本身包含到项目输出中。
因此,要删除这个 * 内部清单 *,您需要从项目的所有表单中删除所有TXPManifest组件(如果您使用了它们),以及从项目的所有单元中删除所有XPMan uses子句引用。
简而言之,对项目的所有单元执行以下两个步骤(如果没有使用TXPManifest组件,第一步是可选的,但第二步是可选的):

z31licg0

z31licg03#

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

截图来自版本10.2.1东京


屏幕截图自版本11.1.3 Alexandria
这会自动处理Kobik's answer底部作为警告提到的XP清单。
我不知道这是哪个 Delphi 版本的。
(Free自由编辑这个答案,如果你知道)。(编辑Ian Murphy 2019年2月:在XE2中不可用)

相关问题