C++ 使用win32 SendMessage I'发送和转换std字符串时;我有了奇怪的角色

C++ 使用win32 SendMessage I'发送和转换std字符串时;我有了奇怪的角色,c++,winapi,sendmessage,stdstring,C++,Winapi,Sendmessage,Stdstring,我需要将文本附加到win32编辑控件我有工作函数来执行此操作,但在编辑控件中打印的文本是gibrish为什么? 从microsoft示例中获取的示例代码 从DlgProc我打电话: std::string ss("wwwwww"); settext(hwnd,ss); 更新 即使我按照这里的建议去做: SendMessage (hWndEdit, EM_REPLACESEL,0,(LPARAM)s.c_str()); 已通过编译,但打印的字符仍为gibrish 如果

我需要将文本附加到win32编辑控件我有工作函数来执行此操作,但在编辑控件中打印的文本是gibrish为什么? 从microsoft示例中获取的示例代码

从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”

问题是

LPSTR pst = &s[0];
不以null结尾。你需要使用

LPCSTR pst = s.c_str();

无法保证
&s[0]
以null结尾,因此您可能只是看到随机内存,直到字符串末尾出现null。可能在某些编译器/库中,它总是以null结尾,因此直到现在才出现


你会想改用
s.c_str()

我猜你的应用程序是为Unicode编译的,因此窗口会将你的ANSI c字符串解释为Unicode c字符串,从而将另一种语言的字符解释为Unicode c字符串。

你可以使用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());
#包括
#包括
void settext(HWND hDlg,std::string s)
{
使用_转换;
LPSTR pst=A2T(s.c_str());
A2T将窄字符串转换为与当前编译设置(Unicode/多字节)兼容的字符串。您也可以使用A2W将ANSI显式转换为宽字符串,但无论您是否在Unicode模式下编译,A2T都将始终执行正确的操作


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

它给了我错误:错误C2440:“初始化”:无法从“const char*”转换为“LPSTR”,将pst声明为LPCSTR,就像编译器告诉您的那样OK这样做了,它确实通过了编译,但我仍然在编辑目录中看到gibrish在用unicode编译的应用程序中,我用英语键入。mybe是问题所在,那么我如何解决这个问题?将LPWSTR传递给SendMessage。使用
wstring
。确保这是您的问题!如果应用程序编译为unicode(确保unicode和_unicode都已定义),则需要传递一个unicode字符串;请改用wstring。为确保这一点,请尝试显式调用SendMessageW,并使用LPCWSTR pstr=ws.c_str(),将pstr作为指向SendMessageW.BrendanMcK的指针传递。这是正确的答案,而且我必须发送带有LL前缀的字符串,这确实是表示宽字符串的方式。使用LPCSTR。C代表
const
-不允许修改
C_str()中指针指向的字符串
。您是以unicode还是ansi模式构建?
#include <windows.h>
#include <atlbase.h>

void settext(HWND hDlg,std::string s)
{
    USES_CONVERSION;
    LPSTR pst = A2T(s.c_str());