在VS2019中创建服务时SERVICE_TABLE_ENTRY初始化报错如何解决?
问题原因
VS2019默认开启了/permissive-(符合模式)编译选项,该选项严格遵循C++标准,不允许将const修饰的字符串常量隐式转换为非const的LPTSTR/LPWSTR类型。你用_T宏定义的字符串常量本身是const属性,而SERVICE_TABLE_ENTRY结构体的第一个成员要求传入非const的LPTSTR类型,因此触发编译报错。你参考的教程使用的是更旧版本的VS,默认未开启符合模式,所以相同代码可以正常编译。
解决方案
推荐按优先级选择以下方法:
- 方法1:安全强制类型转换(最推荐,无需修改其他配置)
因为StartServiceCtrlDispatcherAPI不会修改传入的服务名字符串,你可以直接手动去掉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
相关产品推荐
相关产品推荐

