些时候,我们需要在 Windows 平台以管理员权限运行某个应用程序。这样的应用程序会在右下角有一个小盾牌的图标:
Windows 如何知道一个应用程序需要在运行时获取管理员权限?这是通过向应用程序的 exe 文件中注入一个 manifest 文件来告知的。知道了这个原理,我们就可以编译出需要管理员权限的 Qt 程序了。下面就是编译过程。
1. 创建一个普通的 Qt 工程。
2. 在这个 Qt 工程中添加一个 XML 文件,命名为 menifest.xml。
menifest.xml 文件内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?
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
=
"applicationname"
type
=
"win32"
>
</assemblyIdentity>
<description>
Description of application
</description>
<!-- Identify the application security requirements. -->
<trustInfo
xmlns
=
"urn:schemas-microsoft-com:asm.v2"
>
<security>
<requestedPrivileges>
<requestedExecutionLevel
level
=
"requireAdministrator"
uiAccess
=
"false"
>
</requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
|
3. 在 .pro 文件中添加下面语句:
1
2
3
|
win32
{
QMAKE_POST_LINK
+=
mt
-
manifest
$
$
PWD
/
manifest
.
xml
-
outputresource
:
$
$
OUT_PWD
/
debug
/
$
$
TARGET
".exe"
$
$
escape_expand
(
\
n
\
t
)
}
|
在这段语句中,win32
块表示仅在 Windows 平台才会运行其中的语句。这保证了我们的项目能够跨平台编译。QMAKE_POST_LINK
意味着会在链接结束之后执行后面的语句,也就是在链接完成后运行:
1
|
mt
-
manifest
$
$
PWD
/
manifest
.
xml
-
outputresource
:
$
$
OUT_PWD
/
debug
/
$
$
TARGET
".exe"
$
$
escape_expand
(
\
n
\
t
)
|
这是一条普通的 CMD 命令,因此需要注意的是,mt(即 mt.exe)必须在环境路径中(mt.exe 是 VS 开发环境提供的一个工具,一般安装过 VS 都会有这个工具)。同时还要注意,$$PWD/manifest.xml
和$$OUT_PWD/debug/$$TARGET".exe"
都是正确的路径。为确保路径正确,可以在 .pro 文件中使用message()
函数输出,例如:
1
|
message
(
$
$
OUT_PWD
/
debug
/
$
$
TARGET
".exe"
)
|
准备完毕之后,重新运行 qmake 再重新构建工程,就可以得到我们想要的可执行程序了:
注意,如果生成失败,可重新尝试运行 qmake 再次构建。还需要注意三个路径的问题:mt.exe,$$PWD/manifest.xml 以及 $$OUT_PWD/debug/$$TARGET”.exe”。
可以直接在pro文件里加
QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\"