当我使用win32 SendMessage发送和转换std字符串时,我得到了奇怪的字符

时间:2011-06-09 20:35:08

标签: c++ winapi sendmessage stdstring

我需要将文本附加到win32编辑控件我有工作功能来执行此操作,但编辑控件中打印的文本为什么? 示例代码取自here

的microsoft示例
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中调用:

std::string  ss("wwwwww");
settext(hwnd,ss);

更新
即使我这样做了:

 SendMessage (hWndEdit, EM_REPLACESEL,0,(LPARAM)s.c_str()); 

通过编辑,但仍然打印的字符是gibrish
 如果我这样做:

LPSTR pst = s.c_str()

它没有通过编译错误:
错误C2440:'初始化':无法从'const char *'转换为'LPSTR'

4 个答案:

答案 0 :(得分:4)

我的猜测是你的应用程序是为Unicode编译的,所以窗口将你的ANSI C字符串解释为Unicode C字符串,因此来自另一种语言的字符。

答案 1 :(得分:2)

问题在于

LPSTR pst = &s[0];

未终止。你需要使用

LPCSTR pst = s.c_str();

答案 2 :(得分:1)

无法保证&s[0]为空终止,因此您可能只是看到任何随机内存,直到字符串结尾后出现空值。可能在某些编译器/库中,它在某些/所有时间都会被终止,因此到目前为止还没有浮出水面。

您希望改为使用s.c_str()

答案 3 :(得分:0)

您可以将LPSTR转换为带有ATL的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 /多字节)。您也可以使用明确将ANSI转换为WIDE的A2W,但无论您是否在Unicode模式下编译,A2T始终都会做正确的事。

A2T实际上在堆栈上为结果字符串分配了足够的空间,因此您不必担心释放它。