在MFC中设置UI标题时出错
error in set UI title in MFC
我试图改变一个MFC窗口的标题如下:
BOOL CameraUI::OnInitDialog()
{
// set ui title
TCHAR wintitle[100];
_stprintf_s(wintitle, sizeof wintitle, _T("Camera %u"), (UINT) getSerialNumber());
SetWindowText(wintitle);
return TRUE;
}
当我调试时,我在函数末尾得到这个错误:
Run-Time Check Failure #2 - Stack around the variable 'wintitle' was corrupted.
我正在使用MSVC 2008。我做错了什么?!
请勿按原样使用sizeof winTitle
_stprintf_s
函数需要的是characters
的个数,而不是bytes
的个数。
由于显然您使用的是TCHAR,那么字符数如下:
sizeof(winTitle) / sizeof(winTitle[0])
或
sizeof(winTitle) / sizeof(TCHAR)
在MS世界中,TCHAR要么是1字节(如果构建是MBCS),要么是2字节(这是Unicode)。
假设您正在使用Unicode,通过仅声明sizeof winTitle
,您指定您的数组可以容纳最多200个字符,但事实并非如此(显示sizeof winTitle
给出的内容,您将看到它是200)。
使用std::string
和std::ostringstream
代替字符缓冲区和sprintf。通过这种方式,您可以通过让这些类为您管理内存来避免缓冲区溢出。你唯一需要直接与c风格字符串交互的时候是在与Win32函数交互的时候。
std::ostringstream output;
std::string wintitle;
output << "Camera " << (UINT) getSerialNumber();
wintitle = output.str();
SetWindowText(wintitle.c_str());
return TRUE;
_stprintf_s
有一个模板化的重载,它不需要缓冲区大小参数。您可以将错误行写成
_stprintf_s(wintitle, _T("Camera %u"), (UINT) getSerialNumber());
模板将自动推断出目标缓冲区的正确长度,并保护您避免传递错误的缓冲区大小。
相关文章:
- 访问者访问变体并返回不同类型时出错
- 在Linux for Windows上编译C++代码时出错
- 读取文件的最后一行并输入到链接列表时出错
- 重载操作程序时出错>>用于类中的字符串 memebr
- 调用专用模板时出错"no matching function for call to [...]"
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 在Google Kick start中提交时出错
- 在c++中访问int到类对象的映射时出错
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 分段错误当我试图运行程序时出错
- 使用dynamic_cast和构造函数时出错
- CHECK(调用)函数在Google Colab中出错
- 用pybind11包装C++抽象类时出错
- 为x86而非x64编译时出错
- 从R调用C++函数并对其进行集成时出错
- 这个函数哪里出错了
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 如何删除已输入的书以及如何使标题,语言和名称在上面放置空格不会出错?
- 在MFC中设置UI标题时出错