我正在编写一个使用 Win32 API 的库,我希望能够为 ASCII 和 Unicode 编译它(宽字符是type
),我正在生成一个内部类名(读取:WinAPI“类”),我我将一个整数附加到一个字符串中,以便为各种 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?