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

在VS2019中创建服务时SERVICE_TABLE_ENTRY初始化报错如何解决?

问题原因

VS2019默认开启了/permissive-(符合模式)编译选项,该选项严格遵循C++标准,不允许将const修饰的字符串常量隐式转换为非const的LPTSTR/LPWSTR类型。你用_T宏定义的字符串常量本身是const属性,而SERVICE_TABLE_ENTRY结构体的第一个成员要求传入非const的LPTSTR类型,因此触发编译报错。你参考的教程使用的是更旧版本的VS,默认未开启符合模式,所以相同代码可以正常编译。

解决方案

推荐按优先级选择以下方法:

  • 方法1:安全强制类型转换(最推荐,无需修改其他配置)
    因为StartServiceCtrlDispatcher API不会修改传入的服务名字符串,你可以直接手动去掉const属性,修改初始化代码如下:
    SERVICE_TABLE_ENTRY ServiceTable[] =
    {
        {const_cast<LPTSTR>(SERVICE_NAME), (LPSERVICE_MAIN_FUNCTION)ServiceMain},
        {NULL, NULL}
    };
    
  • 方法2:将服务名定义为可写字符数组
    不要用宏定义常量字符串,改为声明可写的字符数组:
    TCHAR SERVICE_NAME[] = _T("My Sample Service");
    
    之后保持原来的初始化代码不变即可正常编译。
  • 方法3:关闭符合模式(仅兼容老代码用,不推荐)
    如果你不想修改原有代码,可以调整项目编译配置:
    打开项目属性 → 配置属性 → C/C++ → 语言 → 将「符合模式」选项修改为「否」,重新编译即可。该方法会关闭C++标准合规检查,可能引入其他隐式风险,不建议优先使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:09:02