wostringstream,Ascii,Unicode,Win32和整数串联到字符串

时间:2012-08-13 07:13:20

标签: c++ winapi unicode ascii stringstream

我正在编写一个使用Win32 API的库,我希望能够为ASCII和Unicode编译它(宽字符是type),我正在生成一个内部类名(读取) :WinAPI“class”)我将一个整数附加到一个字符串,以便为各种windows函数创建唯一的类名。

所用变量的定义:

LPCTSTR lpszClassName;    //  This is char* if ASCII, wchar_t* if Unicode.
#ifdef UNICODE
std::wostringstream Convert;
#else
std::ostringstream Convert;
#endif

有问题的功能:

void Base::MakeClassName () {
#ifdef _DEBUG_
    cerr << "Base::MakeClassName() called\n";
#endif
static int name_mod = 0;
name_mod++;
lpszClassName = TEXT("Win32WinNo");
Convert << lpszClassName << name_mod;
lpszClassName = Convert.str().c_str();

#ifdef _DEBUG_
    cerr << "Generated class name = " << lpszClassName << "\n";
#endif
}

在ASCII中,我得到Generated class name = Win32WinNo1

在Unicode中,我得到一个十六进制值。这对我来说,宽广的角色wostringstream没有做我想做的事。无论哪种方式,CreateWindow似乎都不喜欢它(程序挂起,如果我调试它,它会崩溃。)

我不是100%熟悉stringstream,并且通过有限的文档,它返回一个'字符串'对象,但我需要一个指向LPCTSTR的C样式字符串的指针,因此,Convert.str().c_str()。我得到的是不正常的,如果我在RegisterClass和CreateWindow调用中尝试TEXT(“Win32WinNo1”),它可以工作,但是从上面返回的字符串是垃圾。

我做错了什么?如果它没有将整数附加到字符串,我也很担心。 wostringstream将整数转换为wchar_t?

3 个答案:

答案 0 :(得分:2)

您输出到cerr,这仍然是一个狭窄的流。它可能会显示lpszClassName的指针值,而不是它指向的宽字符串。

答案 1 :(得分:2)

ostringstream::str返回当前与字符串流缓冲区关联的字符串对象的副本。 c_str指向该临时字符串内部的缓冲区。只要这个临时字符串超出范围,lpszClassName就是一个悬空指针。

这可能是您的程序崩溃/挂起的原因。

答案 2 :(得分:-1)

我认为你需要用_T()包围你的字符串文字,因此它们将是charwchar_t s,具体取决于你的UNICODE设置。

例如_T("Hello World")