当我使用 win32 发送消息发送和转换标准字符串时,我得到奇怪的字符

When I send and convert std string with win32 SendMessage I'm getting weird characters

本文关键字:字符 转换 win32 消息 标准 字符串      更新时间:2023-10-16

我需要将文本附加到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实际上在堆栈上为生成的字符串分配了足够的空间,所以您不需要担心释放它