我最近浏览了一堆用VB6编写的独立实用程序应用程序,以确保Windows Vista及更高版本的注册表虚拟化已关闭。我为每个exe创建了一个独立的清单文件,适当地设置了requestedExecutionLevel
(其中一些需要修改HKEY_LOCAL_MACHINE
注册表项,其他则不需要),并对它们进行了测试。他们都似乎正常工作。将应用程序清单嵌入到VB6 exe中
我只剩下一个小问题。由于它们是独立的实用程序,人们习惯于在网络上复制它们并手动运行它们。如果有人忘记复制清单文件以及exe文件,那么这个exe文件将默默地写入虚拟化的注册表键值而不是真正的,导致难以调试的问题。
显而易见的解决方案是将manifest作为资源嵌入到exe中。所有我已经在网络上阅读这些文章告诉你嵌入这样的资源:
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "app.manifest"
这应该工作得很好,除了VB编译器总是与资源ID创建应用程序图标= 1。当我试着上面的代码,Windows拒绝运行该exe文件,抱怨资源错误(我将在稍后更新这篇文章)。我尝试将资源ID更改为另一个编号,之后Windows成功运行程序,但未识别清单内容。
有谁知道一种方式来获得嵌入式清单工作在VB6 EXE,或者我应该坚持使用外部文件?
UPDATE 1
以上给出的文本是.rc
文件的全部内容。我把它编译成一个.res
文件是这样的:
"%ProgramFiles%\Microsoft Visual Studio\VB98\Wizards\rc.exe" /r /fo "Resources.res" "Resources.rc"
而在VB6的项目文件中像这样将它嵌入:
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\..\WINDOWS\system32\stdole2.tlb#OLE Automation
Form=Main.frm
ResFile32="Resources.res"
IconForm="FMain"
Startup="FMain"
HelpFile=""
Title="Windows Vista Registry Test - VB6"
ExeName32="RegistryTestVB6.exe"
Path32=""
Command32=""
Name="RegistryTestVB6"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionComments="Windows Vista Registry Test - VB6"
VersionCompanyName=""
VersionFileDescription="Windows Vista Registry Test - VB6"
VersionLegalCopyright=""
VersionProductName="Windows Vista Registry Test - VB6"
CondComp=""
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
,当我读到编译EXE到VS2008资源编辑器,它看起来是这样的:
RegistryTestVB6.exe
Icon
1 [Neutral]
RT_MANIFEST
1 [English (United States)]
Version
1 [English (United States)]
当我构建VS2008完全等效VB.NET测试应用程序,然后加载到资源edito R,它看起来像这个:
RegistryTestNET.exe
Icon
32512 [Neutral]
RT_MANIFEST
1 [Neutral]
Version
1 [Neutral]
更新2
测试 - 对.NET的exe运行在Windows XP和Windows 7。但是细,VB6的EXE产生在XP下面的错误:
此应用程序无法启动,因为应用程序配置不正确。重新安装该应用程序可能会解决此问题。
和7以下错误:
的应用已启动失败,因为其侧由端配置不正确。请参阅应用程序事件日志或使用命令行sxstrace.exe工具获取更多详细信息。
寻找在事件日志中我看到下面的条目:
激活上下文生成失败的“RegistryTestVB6.exe”。第10行的清单文件或策略文件“RegistryTestVB6.exe”中出现错误。无效的Xml语法。
不用说,XML是无效的,它是完全相同的文件与我使用.NET EXE相同的编码,并且这一个工程。
解决方案
VB6的编译器确实需要包含在资源的任意文本文件必须是4个字节的整数倍。我只是增加空间的XML直到记事本+ +告诉我,文件总大小,包括BOM是4.
感谢两个迈克尔和吉姆·多指着我在正确的方向。只是可惜我不能将你们都标记为答案!
不知道你的问题是什么,但它不是图标。每类资源(RT_MANIFEST,RT_ICON)都有它自己的id名称空间。你能给我们更多的.rc文件的文本吗? – 2010-02-02 09:14:25
我依稀记得有关XP和Vista希望在不同的资源ID的清单的东西。尝试使用RESOURCE_ID 2,或者可能在ID 1和ID 2中放入相同的清单。 – 2010-02-02 09:25:45
@JohnKnoeller资源ID实际上有一个含义并可以产生不同的结果,请参见[here](http://blogs.msdn.com/b /junfeng/archive/2007/06/26/rt-manifest-resource-and-isolation-aware-enabled.aspx)以获取详细信息。 – takrl 2013-01-21 10:34:56