VB6清单在Windows 7上不工作
我已经为在Windows 7上运行的VB6应用程序创建了一个清单文件(不是用于任何视觉样式更改,只是为了确保它访问通用注册表而不是虚拟化版本)VB6清单在Windows 7上不工作
的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安装的一些问题而不是清单的错误。有任何想法吗?
我会趁拉沃尔佩的清单创作者,对于XP,Vista和Windows 7的伟大工程:http://www.vbforums.com/showthread.php?t=606736
我曾尝试过使用Make My Manifest,但当我打开两个项目时它已经崩溃,所以我采取了一个急转弯,这个工具似乎可以正常工作。感谢 – 2010-12-21 10:09:41
任何人都会对此有所磕磕绊绊 - 近18个月后;我已经为许多VB6项目使用了这个清单创建器,并且工作顺利。 – 2012-05-03 08:05:08
你可能会碰到融合缓存(和Explorer Shell的图标缓存)。无论如何都强烈建议不要使用外部清单,但在程序运行之后尝试添加一个通常会导致这种症状。
请参阅Manifest and the fusion cache的简要说明。
你也可以用touch EXE来重新加载缓存。
这似乎正是我所看到的情景 - 对外部清单的更改似乎没有任何区别,然后突然它会工作没有明显的原因 - 现在我知道为什么! – 2010-12-21 10:11:02
我只发现一个明显的跨所有平台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>
应用的样式在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的倍数)。
然后:
- 下载资源黑客并打开它以管理员身份
- 文件>打开VB6.EXE
- 文件>新建空白脚本
- 类型:
1 24 "vb6.exe.manifest"
- 编译脚本
- 保存
只适用于IDE – 2016-07-06 19:31:44
是的,这是我放在第一行。这是在编译前调试它时看到应用程序的视觉风格 – 2016-07-07 03:56:17
这不是我问的问题 – 2016-07-07 06:32:33
如果它在exe上有防护罩,当它运行时它肯定会提示提升吗?在那种情况下,它不会得到虚拟化,至少不会是UAC虚拟化。在试图处理您的清单问题之前,您是否真的确信它正在写入虚拟化蜂巢位置? – 2010-12-20 12:27:18
它不是要求提升,它不应该(我认为显示盾牌的图标必须是某种Windows bug),因为它在运行时会使用虚拟注册表,因为数据的路径与我右键单击并运行管理员。问题在于清单似乎没有效果(即使我将该级别更改为需要管理员) – 2010-12-20 13:28:48
清单明确有效吗?例如它是UTF-8编码的吗? – MarkJ 2010-12-20 16:24:23