CString::GetString()用作CWnd::SendMessage()传参是否安全?
结论先行
你修改后的写法是安全的,使用static_cast<WPARAM>(strName.GetString())做类型转换也是正确且更推荐的写法。
具体分析
1. 为什么修改后的写法安全
你调用的是SendMessage,它属于同步调用:只有等目标窗口的消息处理函数完全执行完成后,SendMessage才会返回。整个调用周期内你的strName对象没有发生任何修改操作,因此CString::GetString()返回的const TCHAR*指针(指向CString内部的只读字符串缓冲区)全程有效,不会出现悬垂指针问题。
你原来的GetBufferSetLength写法属于不必要的冗余操作:GetBuffer系列接口仅用于需要获取可修改的CString内部缓冲区的场景,你这里仅需要传递只读的字符串指针,完全不需要调用GetBuffer,后续配套的ReleaseBuffer操作反而增加了遗忘漏写的出错风险。
2. 关于类型转换的正确性
static_cast<WPARAM>(strName.GetString())是比C风格强制转换更安全的正确写法:
GetString返回的const TCHAR*属于指针类型,WPARAM是Windows定义的、宽度足以容纳指针的整数类型,二者的转换逻辑合法static_cast会在编译期做类型合法性校验,避免误转完全不相关的类型,比裸写(WPARAM)的C风格转换更规范,也更易排查问题- 你的消息处理函数里将
wParam转回LPCTSTR(也就是const TCHAR*),完全匹配GetString返回的const指针属性,整个类型转换链路没有问题。
额外注意事项
如果后续你把SendMessage改成异步的PostMessage,这个写法就会出现风险:PostMessage会立刻返回,不会等待消息处理完成,此时如果strName离开作用域被销毁,消息处理函数拿到的就是悬垂指针,访问会触发崩溃。这种场景下需要额外做字符串拷贝(比如把字符串内容复制到堆内存传递,接收方处理完自行释放)。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

