我想为我的VB 6.0程序创建一个清单文件,这样当我启动我的应用程序时,操作系统应该询问用户管理员权限。
我也想知道如何在应用程序中嵌入它?
答案 0 :(得分:24)
您实际上并未在VB中创建清单文件。 Windows应用程序清单是标准文本文档,格式为XML。您可以在记事本中创建它,并使用相应的文件名将其保存在应用程序的目录中(YourAppName.exe.manifest
)。
Microsoft在此处提供了更多信息:Application Manifests。它甚至包括一个示例清单,您可以将其复制并粘贴到空白文本文件中以开始使用。
重要的是,如果您希望应用程序提示用户提升,请将requestedExecutionLevel
设置为 requireAdministrator
,而不是asInvoker
。有关使用UAC清单的具体信息,请here。
所以完整的样本可能看起来像这样:
<?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="*"
name="MyMagicalApplication"
type="win32"
/>
<description>Sample manifest for your super cool application</description>
<!-- Request version 6 of the common controls. -->
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
将清单嵌入可执行文件的传统方法是使用mt.exe
utility,它是Windows SDK的一部分。
VBAccelerator site还有一些关于在VB 6应用程序中嵌入清单的信息。具体来说,它说:
提供清单有两种方法:最简单(但最不优雅)的方法是在磁盘上为可执行文件提供清单。假设您的应用程序名为TimeSlot.exe。然后,如果您将清单XML保存为
TimeSlot.exe.manifest
在与可执行文件相同的目录中,TimeSlot.exe将自动获取XP样式。提供了VB5和VB6示例。如果在运行应用程序之前重命名.manifest文件,则可以关闭XP样式。
更健壮的方法是将清单编译为应用程序中的资源。为此,清单必须显示为标识为
RT_MANIFEST
(1)的资源类型CREATEPROCESS_MANIFEST_RESOURCE_ID
(24)。出于某些奇怪的原因,您必须还要确保生成的XML文件是4个字节长的偶数倍。因此,例如,如果您的文件实际上是597字节,则需要在编译之前添加填充空格以将文件大小组成600字节。 Resource示例演示了如何使用资源编译器脚本(.rc文件)和RC.exe创建此资源文件。
但是,如果您想在从VB 6 IDE构建应用程序时自动嵌入清单 ,那么您将面临更多困难。 VB 6 IDE不支持构建后步骤,因此您无法在命令行上运行mt.exe
来为您执行此操作。 是 我在网络上看到的一些声称会自动为您嵌入清单的实用程序,但我相信其中大多数是只处理请求vC的ComCtl32.dll的旧实用程序。我不确定它们是否可以轻松扩展以包含UAC权限,但它值得一试。以下是一些要查看的链接:
答案 1 :(得分:6)
这是一种在VB6应用程序的构建时包含清单的方法:
使用以下内容生成资源文件“my.rc”:
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "my.manifest"
您可以在msdn blogs找到有关常量的更多信息。似乎你需要使用
#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2
用于dll项目。
rc.exe
将此.rc文件编译为.res文件。我在过去几个月里一直在使用这个,没有问题,需要在Windows 7上运行两个旧的遗留应用程序。您可能需要试验如何保存清单文件,对我来说只保存为没有BOM的UTF8工作正常。
要检查以这种方式嵌入的确切内容,您还可以使用mt.exe
从已编译的exe / dll中提取清单。这就是帮助我找到BOM问题的原因......