我正在编写一个使用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?
答案 0 :(得分:2)
您输出到cerr
,这仍然是一个狭窄的流。它可能会显示lpszClassName
的指针值,而不是它指向的宽字符串。
答案 1 :(得分:2)
ostringstream::str
返回当前与字符串流缓冲区关联的字符串对象的副本。 c_str
指向该临时字符串内部的缓冲区。只要这个临时字符串超出范围,lpszClassName
就是一个悬空指针。
这可能是您的程序崩溃/挂起的原因。
答案 2 :(得分:-1)
我认为你需要用_T()包围你的字符串文字,因此它们将是char
或wchar_t
s,具体取决于你的UNICODE设置。
例如_T("Hello World")
。