【问题标题】:Can a manifest resource be added to a VB6 project using the Resource Editor?可以使用资源编辑器将清单资源添加到 VB6 项目吗?
【发布时间】:2010-07-02 15:10:25
【问题描述】:

我们有一个 VB6 项目,它编译成一个 ActiveX EXE,它的文件名中恰好有“patch”一词(它是警察调度系统的一部分),这导致 Windows 7 上的Installer Detection 认为它需要海拔。

我不想重命名 EXE,而是想将清单资源嵌入到已编译的 EXE 中,该资源将请求 asInvoker 权限级别。从阅读中,我知道我可以在使用 Windows SDK 中的mt 工具编译 EXE 后执行此操作,但我更愿意将清单放在 .RES 文件中,以便在我构建时将其编译到程序中项目。

有没有办法使用资源编辑器插件将清单资源(资源类型 24)添加到 VB6 项目?我将清单文件添加为自定义资源,并为资源类型尝试了几个不同的值,例如“RT_MANIFEST”和“24”,然后通过使用mt 重新提取清单来测试它是否工作,但是我无法让它工作。

注意:正如我访问的几页中提到的,我确实记得将清单设置为 4 字节的偶数倍,所以我认为这不是问题。

【问题讨论】:

  • 有趣的问题。我们在 Vista 上的几个 exe 中遇到了这个问题,并通过重命名 exe 或更改项目设置中的某些属性来解决它。
  • 重命名是最简单的解决方案,但我不想更改安装程序以删除旧文件并添加新重命名的文件,因为我们有许多不同的安装程序来安装该特定文件.此外,将它嵌入会更好,这样 Windows 7 上的开发人员就不必做任何事情来让它在他们的机器上运行。加上知道如何添加任何类型的资源可能对其他事情有用,所以我想我会尝试弄清楚如何通过清单资源来做到这一点。很高兴知道这实际上很容易做到。

标签: vb6 windows-7 uac manifest


【解决方案1】:

起初,我想尝试使用rc 创建一个.RES 文件,我可以将其添加到我的项目中。我以前从未使用过rc,所以我在尝试解决这个问题时最终使用了这个MSDN page

有趣的是该页面上对typeNameId 的描述(添加了重点):

类型名称或标识符 资源。指定字符串名称或 数字。 如果使用数字,请在前面加上 带有“#”的字符串表示它 代表一个数字。每个资源类型 元素必须只有一个 typeNameId 属性。

我心想,“嗯,这很有趣,可能不适用于 VB6 的资源编辑器,但我还是会尝试一下。”

瞧,如果您将清单文件添加为自定义资源,然后将其类型更改为 #24(即使用 # 前缀),它就可以工作!它作为清单资源正确嵌入到已编译的 EXE 中。

详细步骤如下:

1) 创建清单文件。我使用了这个(请注意,在我的情况下,最后的填充使文件正好是 608 个字节):

DispatchMonitor RunAsInvoker 修复安全> 信任信息> 汇编>

2) 在 VB6 IDE 中通过从 Tools 菜单中选择 Resource Editor 打开 Resource Editor(您可能必须先启用它在加载项 > 加载项管理器)。

3) 如有必要,创建一个新的资源文件。

4) 添加新的自定义资源(单击“?”图标左侧的按钮)。

5) 出现文件选择对话框:选择在步骤 1 中创建的清单文件。

6) 默认情况下,资源将添加到 ID 为 101 的“CUSTOM”文件夹下。

7) 双击新资源。将“类型”更改为#24,将“ID”更改为 1。

8) 保存更改并关闭资源编辑器

【讨论】:

  • 不,“#24”不是RT_MANIFEST 资源类型。通常我创建并附加一个空的 .res 文件并关闭 VB 项目,然后启动 VC 并编辑 .res 文件以插入清单。这样,最终的 exe 会自动嵌入清单。另外,VB6资源编辑器可以枚举.res文件中任何类型的项目(包括RT_MANIFEST)但不能查看它们的内容。
  • @wqw:“#24”确实有效。 RT_MANIFEST 是一个等于 24 的常数。试试看。我通过运行mt 确认它是否可以将资源识别为清单并将其提取到文件中:mt.exe -inputresource:MyExe.exe;#1 -out:extracted.manifest。此命令不适用于任何其他资源类型,但是当我使用 #24 的资源类型执行此命令时,mt 能够从编译的 EXE 中提取清单。此外,我在一台 Windows 7 机器上安装了该程序,操作系统能够读取清单,因为它移除了 EXE 图标的屏蔽。
  • 另外,在我按照我在帖子中描述的方式嵌入清单后,程序不再生成“需要海拔”错误,所以我 100% 确定我上面概述的步骤有效。
  • 好的,但是RT_MANIFEST 不是“#24”,毕竟是数字类型。使用“#24”作为字符串实在是太糟糕了。显然 mt.exe 和操作系统正在竭尽全力找出清单资源类型。无论如何,我会在 XP(不带 SP)和 Vista 上测试它,而不是在最新的“防跛脚”Win7 上。
  • @wqw:我不认为这是一个 hack。 rc.exe 的文档说在资源类型常量前加上 # 是通过数字识别资源类型的正确方法。看起来 VB6 资源编辑器只是遵循相同的规则。如果您反编译 VB6 EXE,编译到 EXE 中的实际资源类型是数字 24,而不是字符串 #24# 字符只是告诉 VB6 将其解释为原始数值,而不是字符串。因为它的工作原理与rc 完全相同,所以对我来说似乎非常好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多