【问题标题】:Modifying UAC Manifest file stored as a Resource Delphi修改存储为资源 Delphi 的 UAC 清单文件
【发布时间】:2014-08-26 23:13:43
【问题描述】:

我希望我的程序在启动时简单地请求提升权限,为此我将一个清单文件作为资源添加到 Delphi 源代码中。这是 XML 文件的内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.1.1.1"
      processorArchitecture="X86"
      name="YourApplicationExeName"
      type="win32"/>
    <description>elevate execution level</description>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
      <security>
        <requestedPrivileges>
          <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
        </requestedPrivileges>
      </security>
    </trustInfo>
  </assembly>

我需要修改显示“YourApplicationExeName”的文件并添加当前的 .exe 名称,因为用户可以随时重命名 .exe 文件。

我想知道的是:当用户打开可执行文件时,如何将可执行文件的新文件名添加到作为资源存储的清单文件中?我知道如何获取新文件名,我只想知道如何使用新文件名更新资源文件?

【问题讨论】:

  • 不是重复的。我的问题是如何修改 XML 文件 - 添加当前应用程序名称 - 并将其添加为资源文件以再次使用?
  • 修改文件的方式与修改任何文件的方式相同。了解如何编辑文本文件是编程的基本先决条件。如果您不知道如何编辑文本文件,则需要回到开头。如果您想知道如何从现在的位置到达您想成为的位置,那么您需要详细解释您当前所做的事情,即您现在所在的位置。我们无法读懂你的想法。请编辑问题并加倍努力解释。
  • 您所要做的就是从任何关于如何编译和添加清单资源的教程开始。他们都是一样的。你可以在那个问题上找到有用的。 1. 制作 XML 文件。 2. 制作 .rc 文件。 3. 将.rc 文件编译成.res 文件。 4. 链接 .res 文件。如果您希望使用高级 $R 选项,可以将步骤 3/4 合并为一个。我们在这里根本不需要另一个“我如何编译和链接资源”的问题。实际上已经有数千人了。
  • 嗨,大卫。我知道如何编辑文本文件,也知道如何编译 .rc 文件并将其添加到项目源中。不是问题。我遇到的问题是更新资源文件 - 使用新值编辑 XML 文件,然后再次将自身添加为资源。我想要的是当用户打开可执行文件时,它必须确定新文件名(不是问题),并将新文件名添加到清单文件(作为资源存储)
  • 什么意思?打开可执行文件?您的意思是创建一个新流程并执行它?请准确解释您在问题中的意思。单击编辑按钮并使其清晰。

标签: delphi resources manifest uac


【解决方案1】:

你所要求的是不可能的。一个进程从一个可执行文件开始。该文件在进程执行时被锁定,无法修改。

如果您希望修改已编译可执行文件中的资源,则使用UpdateResource API。但该文件不能被锁定才能这样做。您需要从不同的过程中执行此操作。

无论如何,我认为您对此进行了过度分析。您希望修改的字段不应包含可执行文件的文件名。毕竟,文件名是可以更改的。该字段具有应用程序的名称,该值独立于可执行文件的文件名。

documentation 是这样描述这个字段的:

唯一命名应用程序或程序集。使用以下格式作为名称:Organization.Division.Name。例如 Microsoft.Windows.mysampleApp。

总之,我认为你被写YourApplicationExeName的人误导了。您根本不应该在程序编译后尝试修改此资源。您应该在编译应用程序时正确设置该字段,仅此而已。

【讨论】:

  • 感谢您的回答。所以换句话说,如果我想更新可执行文件的资源,另一个可执行文件必须这样做,因为第一个可执行文件无法运行。另外,“YourApplicationExeName”字段不需要可​​执行文件的文件名,而是应用程序的名称?
  • 在这两个方面都正确。您绝对不想像这样修改可执行文件。我从来没有遇到过这样的程序。
【解决方案2】:

告诉 Delphi 不要将程序集清单包含在您的可执行文件中,而是使用外部清单。

例如:

Contoso.exe
Contoso.exe.manifest

.manifest 文件只是一个 XML 文件。当用户将Contoso.exe 重命名为Frobber.exe 时,您可以:

  • 告诉他们也将Contoso.exe.manifest 重命名为Frobber.exe.manifest
  • 在启动Frobber.exe 之前,为他们将Frobber.exe.manifest 文件吐到硬盘上

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 2023-03-22
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多