2014-07-06 21 views
0

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

<?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文件随时随地。

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

+0

不前一个副本。我的问题是如何修改XML文件 - 添加当前应用程序名称 - 并将其添加为资源文件以再次使用? – ddvniek

+0

您可以像修改任何文件一样修改文件。这是编程的基本先决条件,您知道如何编辑文本文件。如果您不知道如何编辑文本文件,则需要返回到开头。如果你想知道如何从你现在的位置到你想要的位置,那么你需要详细解释你目前的工作,即你现在的位置。我们无法读懂你的想法。请编辑这个问题,并花更多的精力来解释。 –

+0

您所要做的就是从任何有关如何编译和添加清单资源的教程开始。他们都是一样的。你可以在这个问题上找到可用的。 1.制作XML文件。 2.制作.rc文件。 3.将.rc文件编译为.res文件。 4.链接.res文件。如果您希望使用高级'$ R'选项,步骤3/4可以合并为一个。我们在这里根本不需要另一个“如何编译和链接资源”问题。已经有成千上万的了。 –

回答

1

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

如果您希望修改已编译的可执行文件中的资源,那么您可以使用UpdateResource API。但该文件不能被锁定才能这样做。你需要从另一个过程来做到这一点。

我认为你无论如何都在过度分析。您希望修改的字段不应包含可执行文件的文件名。毕竟,文件名可以改变。该字段具有应用程序的名称,该值与可执行文件的文件名无关。

documentation描述此字段是这样的:

独特的名称应用程序或组件。对名称使用以下格式:Organization.Division.Name。例如Microsoft.Windows.mysampleApp。

总之,我想你已经被写过YourApplicationExeName的人误导了。在程序编译完成后,你不应该试图修改这个资源。编译应用程序时,应该正确设置字段,就是这样。

+0

谢谢你的回答。换句话说,如果我想更新可执行文件的资源,另一个可执行文件将不得不这样做,因为第一个可执行文件无法运行。 此外,“YourApplicationExeName”字段不需要可​​执行文件的文件名,而是应用程序的名称? – ddvniek

+0

两个计数都正确。你绝对不想像这样修改可执行文件。我从未遇到过这样的计划。 –

0

让Delphi不要在程序中包含程序集清单,而是要有一个外部清单。

例如:

Contoso.exe 
Contoso.exe.manifest 

甲文件只是一个XML文件。当用户重命名Contoso.exeFrobber.exe,您可以:

  • 告诉他们一个Frobber.exe.manifest文件还重命名Contoso.exe.manifestFrobber.exe.manifest
  • 呕出来到他们的硬盘驱动器在启动Frobber.exe