当我使用 win32 发送消息发送和转换标准字符串时,我得到奇怪的字符
When I send and convert std string with win32 SendMessage I'm getting weird characters
我需要将文本附加到win32编辑控件中,我有工作功能可以做到这一点,但编辑控件中打印的文本是gibrish为什么?示例代码取自微软示例
void settext(HWND hDlg,std::string s)
{
//std::wstring ws;
//ws.assign( s.begin(), s.end() );
//LPWSTR pwst = &ws[0];
//// get temporary LPCWSTR (pretty safe)
//LPCWSTR pcwstr = ws.c_str();
//SetDlgItemText(hWndEdit, IDC_EDIT1,pcwstr);
HWND hWndEdit = GetDlgItem (hDlg, IDC_EDIT1);
LPSTR pst = &s[0];
int ndx = GetWindowTextLength (hWndEdit);
SetFocus (hWndEdit);
#ifdef WIN32
SendMessage (hWndEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);
#else
SendMessage (hWndEdit, EM_SETSEL, 0, MAKELONG (ndx, ndx));
#endif
SendMessage (hWndEdit, EM_REPLACESEL,0,(LPARAM)pst);
}
并且从DlgProc im调用:
std::string ss("wwwwww");
settext(hwnd,ss);
更新
即使我按照这里的建议做:
SendMessage (hWndEdit, EM_REPLACESEL,0,(LPARAM)s.c_str());
通过编译,但印刷的字符仍然是吉布里什
如果我这样做:
LPSTR pst = s.c_str()
它没有通过编译-错误:
错误C2440:"initializing":无法从"const char*"转换为"LPSTR"
我的猜测是,您的应用程序是为Unicode编译的,因此窗口将您的ANSI C字符串解释为Unicode C字符串,因此字符来自另一种语言。
问题是
LPSTR pst = &s[0];
不是null终止的。你需要使用
LPCSTR pst = s.c_str();
不能保证&s[0]
是null终止的,所以您可能只是看到那里有任何随机内存,直到字符串结束后出现null。可能在一些编译器/库中,它在某些时候/所有时候都是null终止的,因此直到现在才出现。
您将需要使用s.c_str()
。
您可以使用ATL将LPSTR转换为LPWSTR,以便Unicode API可以对其进行消化。
#include <windows.h>
#include <atlbase.h>
void settext(HWND hDlg,std::string s)
{
USES_CONVERSION;
LPSTR pst = A2T(s.c_str());
A2T将窄字符串转换为与当前编译设置兼容的字符串(Unicode/多字节)。您也可以使用A2W,它明确地将ANSI转换为WIDE,但无论您是否以Unicode模式编译,A2T都会做正确的事情。
A2T实际上在堆栈上为生成的字符串分配了足够的空间,所以您不需要担心释放它
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何使用C++将字符串中的字符转换为整数变量
- 字符转换功能 std::isupper() & std::islower() C++17
- 将字符 * 转换为字符串 *
- 在编译时将常量字符* 转换为常量 char_type*
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 无法使用字符串流将字符转换为字符串C++
- 将无符号字符 C++ 转换为 C#
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 无法<string>从"常量字符 []"转换为<类名>
- 不能将字符转换为整数吗?
- 编译时将字符*转换为字节
- CP1251:从字符* 转换为 wchar_t* 时的编码失真
- 将单个字符转换为 std::string 前缀 \x01
- PPM 将字符转换为 int 授予负数
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- 将常量字符* 转换为字符时出错