【问题标题】:VB6 Manifest not working on Windows 7VB6 清单不适用于 Windows 7
【发布时间】:2010-12-20 11:25:53
【问题描述】:

我为在 Windows 7 上运行的 VB6 应用程序创建了一个清单文件(不是为了任何视觉样式更改,只是为了确保它访问通用注册表而不是虚拟注册表)

exe 名称为 Capadm40.exe,清单名称为 Capadm40.exe.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="CompanyName.Capadm40"
     type="win32"/>
  <description>Administers the System</description>
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>

但是,这似乎没有任何区别。即应用程序仍在使用虚拟化注册表配置单元。同样奇怪的是,当我在应用程序 exe 的属性中取消勾选“以管理员身份运行此程序”选项后,Windows 仍然在应用程序图标上显示一个盾牌,导致我认为这是我的 Windows 安装的一些问题,而不是而不是清单的错误。有什么想法吗?

【问题讨论】:

  • 如果exe上有屏蔽,运行的时候肯定会提示提升吗?在那种情况下,它不会获得虚拟化,至少不会获得 UAC 虚拟化。在尝试处理清单问题之前,您真的确定它正在写入虚拟配置单元位置吗?
  • 它不要求提升,也不应该(我认为显示盾牌的图标一定是某种 Windows 错误),因为当它运行时,它使用的是虚拟化注册表,因为路径当我右键单击并运行管理员时,数据是不同的。问题是清单似乎没有效果(即使我将级别更改为requireAdministrator)
  • 清单确定有效吗?例如是 UTF-8 编码的吗?
  • 是的,这是我开始检查的内容,因为一些文本编辑器在后台透明地更改了编码

标签: vb6 windows-7 uac manifest vb6-migration


【解决方案1】:

您可能与 fusion 缓存(以及 Explorer Shell 的图标缓存)发生冲突。无论如何强烈建议不要使用外部清单,但在程序之前运行后尝试添加清单通常会导致此类症状。

有关简要说明,请参阅Manifest and the fusion cache

您也可以touch EXE 重新加载缓存。

【讨论】:

  • 这似乎正是我所看到的场景 - 对外部清单的更改似乎没有任何区别,然后突然之间它会无缘无故地工作 - 现在我知道为什么了!跨度>
【解决方案2】:

我会利用 LaVolpe 的清单创建者,它适用于 XP、Vista 和 7:http://www.vbforums.com/showthread.php?t=606736

【讨论】:

  • 我之前尝试过使用 Make My Manifest,但是当我打开我的两个项目时它崩溃了,所以我急转弯,不过这个工具似乎运行良好。谢谢
  • 对任何偶然发现此问题的人的进一步说明 - 近 18 个月后;我已经在许多 VB6 项目中使用了这个清单创建器,并且运行顺利。
【解决方案3】:

我只找到了一个适用于所有平台 9x+ 的清单。甚至根本工作。所有的例子、文章等我都试过了。

版本号或添加到它的任何其他内容都会杀死它。可能的例外是requestedExecutionLevel 上的额外参数,这似乎没问题。您可以更改级别,并且可以添加 uiAccess。那些是允许的。经过大量的二进制计数测试,我发现微软提供的那些可爱的清单额外功能只会让窗口出现各种错误。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <ms_asmv2:trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2">
        <ms_asmv2:security>
            <ms_asmv2:requestedPrivileges>
                <ms_asmv2:requestedExecutionLevel level="asInvoker">
                </ms_asmv2:requestedExecutionLevel>
            </ms_asmv2:requestedPrivileges>
        </ms_asmv2:security>
    </ms_asmv2:trustInfo>
</assembly>

【讨论】:

    【解决方案4】:

    在 VB6 IDE 中应用样式:

    将此文本保存在与 vb6.exe 位于同一文件夹中的名为 vb6.exe.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="Microsoft.VisualBasic.IDE"
        type="win32"
    />
    <description>Visual Basic 6 IDE</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="X86"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>   
    

    在文件末尾添加空格,直到达到 672 字节(4 的倍数)。

    然后:

    1. 下载资源黑客并以管理员身份打开
    2. 文件>打开VB6.exe
    3. 文件 > 新建空白脚本
    4. 类型: 1 24 "vb6.exe.manifest"
    5. 编译脚本
    6. 保存

    【讨论】:

    • 是的,这是我放在第一行的内容。这是在编译之前在调试应用程序时以视觉样式查看应用程序
    • 我问的不是这个
    猜你喜欢
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2014-08-19
    • 1970-01-01
    相关资源
    最近更新 更多