我最近浏览了一堆用VB6编写的独立实用程序应用程序,以确保Windows Vista及更高版本的注册表虚拟化已关闭.我为每个exe创建了一个独立的清单文件,设置得requestedExecutionLevel恰当(其中一些需要修改HKEY_LOCAL_MACHINE注册表项,其他不需要),并测试它们.它们似乎都正常工作.
我只剩下一个小问题.由于它们是独立的实用程序,人们习惯于只在网络上复制它们并手动运行它们.如果有人忘记复制清单文件以及exe,那么exe将静默写入虚拟化注册表项而不是真实注册表项,并导致难以调试的问题.
显而易见的解决方案是将清单作为资源嵌入到exe中.我在网上看到的所有文章都告诉你要嵌入这样的资源:
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "app.manifest"
Run Code Online (Sandbox Code Playgroud)
这应该工作得很好,除了VB编译器总是创建资源ID = 1的应用程序图标.当我尝试上面的代码时,Windows拒绝运行exe,抱怨资源错误(我将更新此帖子与细节稍后).我尝试将资源ID更改为另一个数字,之后Windows成功运行程序但未识别清单内容.
有没有人知道如何让一个嵌入式清单在VB6 exe中工作,或者我应该坚持使用外部文件?
更新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 - …Run Code Online (Sandbox Code Playgroud)