Visual Studio多字节编码环境下Windows服务代码C2440类型转换错误修复求助
Visual Studio多字节编码环境下Windows服务代码C2440类型转换错误修复求助
你好,我来帮你解决这个C2440类型转换错误的问题,完全不会破坏原有代码逻辑。
首先咱们定位一下错误根源:报错指向代码第18行,也就是SERVICE_TABLE_ENTRY数组里的TEXT("MyService")这部分。在Visual Studio的多字节编码模式下,TEXT("MyService")会被展开成**const char[]**类型,但SERVICE_TABLE_ENTRY结构体的lpServiceName成员是LPSTR(对应多字节环境下的非constchar*)。C++的类型检查非常严格,不允许把const指针隐式转换成非const指针,所以就触发了这个错误。
下面给你两种安全的修复方案,任选其一就行:
方案一:用const_cast显式转换(推荐)
这种方法最直接,因为系统底层根本不会修改服务名这个字符串,所以强制转换是安全的。修改main函数里的服务表定义:
int main() { SERVICE_TABLE_ENTRY ServiceTable[] = { { const_cast<LPSTR>(TEXT("MyService")), ServiceMain }, { NULL, NULL } }; if (StartServiceCtrlDispatcher(ServiceTable) == FALSE) { printf("StartServiceCtrlDispatcher failed (%d)\n", GetLastError()); } return 0; }
方案二:定义非const字符数组存储服务名
如果你不想用强制转换,也可以把服务名放到一个非const的字符数组里,这样类型就完全匹配了:
int main() { TCHAR szServiceName[] = TEXT("MyService"); SERVICE_TABLE_ENTRY ServiceTable[] = { { szServiceName, ServiceMain }, { NULL, NULL } }; if (StartServiceCtrlDispatcher(ServiceTable) == FALSE) { printf("StartServiceCtrlDispatcher failed (%d)\n", GetLastError()); } return 0; }
这两种方法都能完美解决编译错误,而且完全保留了你原来的服务逻辑。修复之后,你就可以继续推进任务:比如在ServiceMain(服务启动时)、ServiceCtrlHandler(服务停止时)和ServiceWorkerThread里添加文件操作代码,把事件记录到文本文件;另外还可以在ServiceWorkerThread里实现命名管道的服务器端逻辑,和你的客户端进行数据交互。
备注:内容来源于stack exchange,提问作者Marchenko
相关产品推荐
相关产品推荐

