致谢和介绍
这个问题帮助了我,我会用我获得的知识来帮助我。谢谢:
Lipika(提出问题的人)揭示了管理员访问权限是将系统目录的访问权限重定向到虚拟目录的原因。后来很清楚,缺乏管理员访问权限会导致写入某些注册表项失败。
snowcrash09 用于显示用于启用需要管理员访问权限的 Visual Studio 选项。随着对 MSDN 的进一步研究,我发现清单没有嵌入到 Properties>Manifest Tool 下的可执行文件中;从而允许我阅读它。
Nayana 与多项式答案的链接也很好。在这里,我将在我的演示中借用他的部分答案。
回答
正如 Lipika 所说,您需要管理员访问权限,否则 Windows Vista 及更高版本会将您重定向到虚拟目录。这是伟大的。从逻辑上讲,您的应用程序应该请求管理员访问权限。您可以让用户手动执行此操作。如果没有,Windows 提供了许多以编程方式执行此操作的方法。最简单的方法是在应用的清单中声明它。在这里,我将专门为不使用 Visual Studio 的个人提供说明。如果您使用的是 Visual Studio,它就像 Properties>Linker>Manifest File>UAC Execution Level 一样简单。
例如,如果您使用 CodeBlocks;创建一个名为 app_resources.rc 的文件。对于 CodeBlocks,它非常重要的是该文件具有.rc
扩展名,因此 CodeBlocks 知道使用 Windows 资源工具编译它。将以下代码复制到此文件中,并将其添加到您的项目中。
#include <windows.h>
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "adminAccess.manifest"
创建一个名为 adminAccess.manifest 的清单文件。将以下代码复制到文件中。不需要将此文件添加到您的项目中,因为它是从您的 rc 文件中引用的。
<?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="MyApplication"
type="win32"/>
<description>Description of your application</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
现在您可以编译您的应用程序,它会在运行时自动提示输入管理员凭据。如果未授予管理员访问权限,它将返回失败。在 Windows Xp 上,不会提示您进行任何身份验证。
请注意,您可以在此处编辑清单以添加功能,例如 Windows 小部件的视觉样式和 DPI 感知。
如果您不使用 CodeBlocks。例如,您正在从命令行编译。您几乎必须使用 Windows 资源工具编译 rc 文件。在 MinGw 构建工具中,这称为 windres.exe。它将编译一个.res
文件。然后,您将此生成的文件与您将在链接器阶段链接的所有其他文件链接。
请注意,rc 文件是一个 Windows 资源文件,其中包含您的应用程序使用的所有资源,例如 BITMAP、ICON、STRING、对话框模板。这将全部存储在最终的可执行文件中。然后,您可以使用 Windows 特定功能从可执行文件中加载。这与 Android 所做的非常相似。