Delphi应用程序清单WinXP和Win7下的文件问题

时间:2010-04-06 21:05:07

标签: windows delphi manifest code-signing privileges

我的上一个问题“在Win-7下列出服务和服务状态”使我开始研究一种解决方案,该解决方案基于.manifest文件为我的应用程序提供Windows Vista以后的管理员权限。

我不确定继续上一个问题,因为它们不一样所以这是另一个问题:

我的应用程序现在在Win 7下运行正常,无论我是否以管理员身份运行它,因为清单文件。 我的清单文件如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.6.0.5" processorArchitecture="X86" name="ServiceMonitorPro" type="win32"/>
  <description publisher="Powershield Ltd" product="Powershield Service Monitor">Powershield Service Monitor</description>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
   <security>
    <requestedPrivileges>
     <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
    </requestedPrivileges>
   </security>
  </trustInfo>
 </assembly>

当应用程序在Windows 7或Vista上运行时,UAC会出现如下对话框: alt text http://www.freeimagehosting.net/uploads/39787fd3dd.jpg

如何更换“未知”发布商?

另一个也是最大的问题是,即使你的应用程序在Win7或Vista下运行没有问题,在WinXP下它现在崩溃了: “此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。”

  

我想补充的另一件事:如果   我向XPMan添加了引用(使用子句)   该应用程序在WinXP上工作正常,但随后   它我的.manifest文件没有   Vista或Win7下的差异。

4 个答案:

答案 0 :(得分:12)

我要感谢大家,通过评论或回答指出我继续挖掘... :) 我去搜索WindowsXP.res文件。 该文件的内容是:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    type="win32"
    name="DelphiApplication"
    version="1.0.0.0" 
    processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
</assembly>

解决方案:我已将我的.manifest文件与添加依赖关系部分的WindowsXP.Res xml混合。 如果有人知道为什么它现在正在工作,我会很高兴听到 - 但这是解决方案 - 到目前为止测试了几个虚拟机,在我的计算机和其他几个......工作:)

答案 1 :(得分:8)

您需要使用代码签名证书对代码进行签名。这里应该有很多例子。我已经通过“代码签名”重新标记了您的问题,您还可以查找“证书” 我自己使用Comodo证书,并使用令人敬畏的,精彩的Visual Build Pro v6签名,这是一个广告客户。

答案 2 :(得分:3)

您也可以在清单中指明与各种Windows版本的兼容性。我知道有与Vista和Win7兼容的条目;不确定XP。

MSDN提供了有关清单兼容性部分的信息。这也可以从链接页面中获得帮助:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>

答案 3 :(得分:1)

在较新版本的Delphi(我认为7及以上版本)中,您还需要确保在项目选项对话框中取消选中“使用运行时主题”选项,否则Delphi将自动链接到其自己的默认清单文件(即它如何启用“主题支持”),您将收到有关应用程序配置不正确的运行时错误,因为会有冲突的条目。

这是Delphi2007应用程序的完整清单文件,需要在Windows 7中以管理员模式运行,并且还包含“依赖”部分以启用运行时主题支持:

    <?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="requireAdministrator"
              uiAccess="false"/>
            </requestedPrivileges>
        </security>
      </trustInfo>
    </assembly>