You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过manifest等方式阻止C++程序在旧版Windows系统启动

限制C++程序仅在Windows 8.1/Server 2012及以上版本启动的解决方案

完全可以通过嵌入manifest的方式实现需求,不需要额外编写运行时检测代码,Windows加载器会在EXE加载阶段就直接抛出系统版本不兼容的标准提示,不会走到后续DLL加载步骤,自然不会出现DLL未找到的报错。


实现步骤

1. 编写manifest配置文件

创建扩展名为.manifest的XML文件,内容如下。其中Windows 8.1/Server 2012 R2对应的版本规则已经内置,如果你需要最低支持Windows 8/Server 2012可以自行调整supportedOS节点:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
            <!-- Windows 8.1/Server 2012 R2 支持ID -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- 高版本系统兼容ID,避免触发兼容性助手提示 -->
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> <!-- Windows 10/11 -->
        </application>
    </compatibility>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

核心逻辑是<supportedOS>节点:Windows加载器读取PE文件时会优先匹配该节点的系统列表,如果当前运行环境不在列表内,会直接弹出标准的系统不兼容提示,终止程序加载流程。

2. 嵌入manifest到EXE

根据你使用的开发工具选择对应嵌入方式:

  • Visual Studio开发:
    右键项目→属性→配置属性→清单工具→输入和输出→附加清单文件,填入上述manifest文件的路径,重新编译即可。也可以直接在任意.cpp文件中加入编译指令嵌入:
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='你的manifest文件名' version='1.0.0.0' processorArchitecture='*' publicKeyToken='*'\"")
    
  • MinGW/GCC开发:
    编译完成后使用Windows SDK自带的mt.exe工具嵌入,命令如下:
    mt.exe -manifest 你的manifest文件名 -outputresource:你的程序名.exe;1
    

注意事项

  • 该方案仅对EXE生效,需要给所有需要限制版本的EXE都嵌入对应manifest
  • 不要遗漏高版本Windows的supportedOS ID,否则在Win10/Win11上运行可能触发兼容性助手提示
  • 32位和64位程序可共用同一份manifest文件,无需区分架构

内容的提问来源于stack exchange,提问作者xMRi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:57:00