10

我有一个将程序设置写入 Windows 注册表的应用程序,这是绝对必要的,因此不能选择存储到文件中。

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

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

这可能是由于与内部清单冲突,为了解决这个问题,我看到很多评论建议在项目选项中禁用“启用运行时主题”。我浏览了每个菜单但找不到它,现在我被告知它可能在 Delphi 7 中不可用,并在以后的版本中引入。

如何添加自己的清单?

4

3 回答 3

25

我已经评论说“将程序设置写入注册表不是授予您的应用程序管理员权限的适当原因”。然而,在任何情况下都包含一个 UAC 清单是一个好主意。常见的requestedExecutionLevel应该是level="asInvoker"查看文档

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

通过“Project > Add to project”菜单项将所需的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.

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

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


确保您没有使用任何其他 XP 清单。

于 2013-02-05T15:18:09.700 回答
12

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

内部清单在 Delphi 中由TXPManifest组件表示 7 次,其唯一目的是将单元添加XPMan.pas到删除它的表单单元的 uses 子句中。然后,该XPMan.pas单元将资源文件与清单本身一起包含到项目输出中。

因此,要删除此内部清单,您需要TXPManifest从项目的所有表单中删除所有组件(如果您使用了它们),以及XPMan从项目的所有单元中删除所有使用子句引用。

简而言之,对项目的所有单元执行以下两个步骤(如果您没有使用组件,则第一步是可选的TXPManifest,但第二步):

在此处输入图像描述

于 2013-02-05T08:33:34.470 回答
4

在较新版本的 Delphi 中,这不再是必需的。
Project Options下,然后是Application,清单中有一个部分:

清单选项
东京版本 10.2.1 的屏幕截图

这会自动处理在Kobik 的答案底部作为警告提到的 XP 清单。

我不知道这是从哪个 Delphi 版本中获得的。
(如果您知道,可以免费免费编辑此答案)。(编辑 Ian Murphy 2019 年 2 月:它在 XE2 中不可用)

于 2017-08-10T14:37:42.577 回答