Delphi 当我的EXE文件名包含单词“QUOTE”时,如何避免UAC;更新";?

Delphi 当我的EXE文件名包含单词“QUOTE”时,如何避免UAC;更新";?,delphi,uac,delphi-7,Delphi,Uac,Delphi 7,我注意到以下现象: 使用Delphi 7构建的可执行文件,其部分名称包括“Update”(例如“UpdateMyApp.exe”)会导致UAC介入显示一条警告,如“是否允许程序对计算机进行更改” 这是通过一个简单的hello world应用程序实现的。在资源管理器中显示文件时,将显示叠加在应用程序图标上的屏蔽符号 一旦重命名exe,屏蔽就会消失,应用程序将在没有警告的情况下启动 如前所述,这种情况只发生在使用Delphi 7构建并在Windows 7上启动的程序上(我假设在Vista上也是如此)

我注意到以下现象:

使用Delphi 7构建的可执行文件,其部分名称包括“Update”(例如“UpdateMyApp.exe”)会导致UAC介入显示一条警告,如“是否允许程序对计算机进行更改”

这是通过一个简单的hello world应用程序实现的。在资源管理器中显示文件时,将显示叠加在应用程序图标上的屏蔽符号

一旦重命名exe,屏蔽就会消失,应用程序将在没有警告的情况下启动

如前所述,这种情况只发生在使用Delphi 7构建并在Windows 7上启动的程序上(我假设在Vista上也是如此),但在例如WinXP上不会发生

用Delphi2007快速检查一下,这个问题就解决了

好笑。。。吓人的


除了重命名文件,我还能做些什么来防止这种情况发生?

这种行为是由于默认情况下使用Delphi 7生成的应用程序没有清单,或者没有属性。正因为如此,Windows认为当应用程序名称包含诸如
Setup
Update
之类的词时,您需要管理员访问权限。这个过程被称为UAC,并与Windows Vista一起引入

从MSDN站点:

安装程序检测仅适用于:

  • 32位可执行文件

  • 没有requestedExecutionLevel的应用程序

  • 以标准用户身份运行且启用LUA的交互式进程

  • 在创建32位进程之前, 将检查以下属性 以确定它是否为 安装程序:

    • 文件名包括“安装”、“安装”、“更新”等关键字
    • 以下版本控制资源字段中的关键字:供应商, 公司名称、产品名称、文件 说明,原始文件名, 内部名称和导出名称
    • 可执行文件中嵌入的并排清单中的关键字
    • 在可执行文件中链接的特定StringTable项中的关键字
    • 可执行文件中链接的RC数据中的关键属性
    • 可执行文件中的目标字节序列
    此外,默认情况下,Delphi 2007在应用程序中使用
    requestedExecutionLevel
    键包含清单

    这是delphi 2007创建的manifiest示例。您可以看到此清单在内容中具有
    requestedExecutionLevel
    属性

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <assemblyIdentity
        type="win32"
        name="CodeGear RAD Studio"
        version="11.0.2902.10471" 
        processorArchitecture="*"/>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            publicKeyToken="6595b64144ccf1df"
            language="*"
            processorArchitecture="*"/>
        </dependentAssembly>
      </dependency>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel
              level="asInvoker"
              uiAccess="false"/>
            </requestedPrivileges>
        </security>
      </trustInfo>
    </assembly>
    
    
    
    这解释了它发生的原因,但没有解释如何解决它是的。包括你自己的清单。如果您使用的是Delphi 7,则必须使用.RC源文件将清单编译成.RES文件,并使用RC.exe进行编译,然后使用
    {$R MyManifest.RES}
    -Delphi的更高版本,如XE和更高版本,在IDE中包括对选择您自己的.manifest文件的支持。我与Youda008有相同的问题。这个答案包含了创建、编译和包含清单文件的详细步骤。注意,我必须运行“brcc32uac.rc”命令;它没有为我自动编译。