2010-07-02 48 views
3

我们有一个VB6项目,编译为一个ActiveX EXE,它恰好在文件名中包含“补丁”这个词(它是警察调度系统的一部分),这导致Windows 7上的Installer Detection认为它需要提升。可以使用资源编辑器将清单资源添加到VB6项目中吗?

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

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

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

+0

有趣的问题。我们在Vista上遇到过几个exes问题,并通过重命名exes或更改项目设置中的某些属性来解决此问题。 – MarkJ 2010-07-02 16:39:07

+0

重命名是最简单的解决方案,但我不想更改安装程序以删除旧文件并添加新重命名的文件,因为我们有许多不同的安装程序来安装该特定文件。此外,嵌入它会更好,因此Windows 7上的开发人员无需执行任何操作即可使其在机器上工作。另外知道如何添加任何类型的资源可能对其他事情有用,所以我想我会试着弄清楚如何通过一个清单资源做到这一点。很高兴知道这确实很容易做到。 – 2010-07-02 16:48:11

回答

4

起初,我想我会尝试使用rc创建一个.RES文件,我可以将其添加到我的项目中。我之前从未使用过rc,所以我在试图弄清楚的时候最终得到了这个MSDN page

什么是有趣的是这样描述的typeNameId该网页上(强调):

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

我心想:“好吧,这很有趣,可能不适用于VB6的资源编辑器,但我会尝试它。”

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

以下是详细步骤:

1)创建一个清单文件。我用这一个(请注意,在端部的填充取得的文件中的我的情况下精确地608字节):

 
<?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" name="DispatchMonitor" type="win32"/> 
    <description>DispatchMonitor RunAsInvoker fix</description> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
      <requestedPrivileges> 
       <requestedExecutionLevel level="asInvoker" uiAccess="false"/> 
      </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 
<!-- Padding to make filesize even multiple of 4 --> 

2)通过从选择资源编辑器打开资源编辑器在VB6 IDE 工具菜单(您可能必须先启用它,才能在加载项>加载项管理器)。

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

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

5)出现一个文件选择对话框中:选择)在步骤1中

6中创建的清单文件的资源将一个“自定义”文件夹下加入由默认的101 ID。

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

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

+0

不,“#24”不是“RT_MANIFEST”资源类型。通常我创建并附加一个空的.res文件并关闭VB项目,然后启动VC并编辑.res文件以插入清单。这样,最终的exe自动获取嵌入式清单。此外,事实证明,VB6资源编辑器可以枚举任何类型的.res文件中的项目(包括'RT_MANIFEST'),但无法查看其内容。 – wqw 2010-07-03 08:12:04

+0

@wqw:“#24”确实有效。 'RT_MANIFEST'是一个等于'24'的常量。试试看。我确认它通过运行'mt'来查看它是否可以将资源识别为清单并将其解压缩到文件中:'mt.exe -inputresource:MyExe.exe;#1 -out:extracted.manifest'。这个命令不适用于任何其他资源类型,但是当我使用资源类型“#24”完成时,'mt'能够从编译后的EXE中提取清单。另外,我将程序安装在Windows 7机器上,操作系统能够读取清单,因为它从EXE的图标中删除了屏蔽。 – 2010-07-05 00:07:47

+0

此外,在我以我在文章中描述的方式嵌入清单后,该程序不再生成“需要提升”错误,所以我100%肯定上述步骤的工作。 – 2010-07-05 00:10:11

相关问题