admin 管理员组

文章数量: 887021

前言

​ 最近要做个守护程序来监听一个http程序,故想到了windows的服务程序。因为大量用户使用xp系统,所以要兼容xp。

​ 我用的是vs2019和boost库。两个都需要设置,才能保证程序在xp下能跑。

vs2019 设置

​ 根据网上的资料,先添加支持xp的编译组件。

我之前没有安装VS 2017 x64/x86生成工具,导致程序一直运行不起来。

把项目的属性的平台工具集改成v141xp,这一步应用之后,vs会自动帮你修改一些参数。

参考文章:VS2019怎样编译出可以在WinXP上运行的exe

重新编译boost库

因为我用的是boost库是1.73.0,所以用这个当示例。

首先下载下来,运行目录下的bootstrap.bat,运行完之后,就会出现一个b2.exe的程序。

我们现在找的vs2019的Developer Command Prompt for VS2019的命令行,打开,切换到boost主目录下,输入一下命令:

b2.exe -j4  --toolset=msvc-14.1 define=BOOST_USE_WINAPI_VERSION=BOOST_WINAPI_VERSION_WINXP  define=_WIN32_WINNT=0x0501  define=_BOOST_USE_WINDOWS_H --build-type=complete stage

-j4 代表运行四个线程去编译,如果你需要用电脑,那么不要加这个参数。

等待大约半个小时,编译完成。vs配置属性 -> C++ -> 命令行 添加-D_WIN32_WINNT=0x0501 ,告诉boost要兼容xp。

参考文章:使用Visual C++高版本的XP支持生成带boost执行文件在XP上报kernel32缺函数

vs2019设置

把boost的头文件和库文件引入到项目中,编译下即可。

结尾

看网上说,编译boost要改什么环境变量,实测不用改也可以。vs2012 编译boost库 兼容xp系统 ,可能vs2019更加智能了。

还有补充一句,因为xp没有UAC控制,所以直接用ShellExecute调起第三方程序就可以了。

用系统函数要注意函数是否支持xp。

后补如何判断是xp系统:

bool isXP()
{
    OSVERSIONINFO   osver;
    osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osver);
    if (osver.dwPlatformId == 2)
    {
        if (osver.dwMajorVersion == 5)
        {
            
            return true;
        }
        
    }
    return false;
}

本文标签: 系统 boost XP