Win32 API下命名管道名称赋值给LPTSTR变量报错如何解决?
Win32 命名管道名称赋值错误修复方案
编译错误E0144原因与修复
LPTSTR 是Win32定义的指向非const TCHAR类型的指针别名,而TEXT()宏包裹的字符串字面量属于常量字符串,类型为const TCHAR*,C++标准不允许隐式将const类型指针赋值给非const类型指针,这是触发E0144错误的根本原因。你之前使用强制类型转换强行剥离const属性属于不安全操作,会留下运行时隐患。
正确的修复方式有两种:
- 若不需要修改管道名称,直接将变量类型改为匹配常量字符串的
LPCTSTR即可:
LPCTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe");
- 若后续需要修改管道名称,将字符串存入可写的TCHAR数组中:
TCHAR szPipename[] = TEXT("\\\\.\\pipe\\mynamedpipe"); // 需要传入LPTSTR参数时,直接传递szPipename即可,数组名会自动退化为LPTSTR类型指针
运行时错误109(ERROR_BROKEN_PIPE)原因与修复
该错误的本质是管道连接被中断,和你之前的强制类型转换没有直接关联,常见触发场景和对应修复方案如下:
- 服务端还未完成管道实例创建,客户端就提前发起连接:调整代码执行顺序,确保服务端先调用
CreateNamedPipe创建管道实例、再调用ConnectNamedPipe监听连接之后,客户端再调用CreateFile发起连接请求 - 管道任意一端已经关闭了句柄,另一端仍在执行读写操作:每次调用
ReadFile/WriteFile执行IO操作前,先校验管道句柄的有效性,收到断开错误时及时清理本地句柄资源 - 服务端和客户端的字符集配置不匹配:确保两端项目的字符集配置统一,同时使用多字节字符集或者同时使用Unicode字符集,避免
TEXT宏生成的字符串编码两端不一致 - 管道读写的缓冲区长度设置错误:确认读写时传入的缓冲区长度参数和实际缓冲区大小匹配,避免越界读写导致的连接异常断开
内容的提问来源于stack exchange,提问作者anastaciu
相关产品推荐
相关产品推荐

