C++ C++;TextOut写入随机数据。是否存在缓冲区溢出?

C++ C++;TextOut写入随机数据。是否存在缓冲区溢出?,c++,user-interface,winapi,C++,User Interface,Winapi,我正在使用WinAPI为编程类编写一些示例程序。我熟悉GUI编程,但不熟悉C++。作为测试的一部分,我遇到了一个异常。我希望有人会知道我做错了什么,并能够解释修复方法。下面是回调函数。大部分代码都是直接从basic paint上的示例复制而来的 LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM w, LPARAM l) { PAINTSTRUCT ps; HDC hdc; std::string txt = "Hello\

我正在使用WinAPI为编程类编写一些示例程序。我熟悉GUI编程,但不熟悉C++。作为测试的一部分,我遇到了一个异常。我希望有人会知道我做错了什么,并能够解释修复方法。下面是回调函数。大部分代码都是直接从basic paint上的示例复制而来的

LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM w, LPARAM l)
{
   PAINTSTRUCT ps;
   HDC hdc;
   std::string txt = "Hello\0";
   switch(msg)
   {
      hdc = BeginPaint(hwnd, &ps);
      TextOut(hdc, 0, 60, txt.c_str(), 45);
      EndPain, h, &ps);
   }
}
因此,该函数应该只是在GUI上打印“Hello”,但我看到的是“Hello xc”。我把绳子的长度扩大到45,看到了更多的东西。它打印随机的文本位。我已经看到了类名和字符串值,它们将被忽略

我不知道为什么会发生这种情况,但看起来txt的读取距离缓冲区的末尾很远。我添加了一个\0。没有区别。每次的值都不同


知道发生了什么吗?

TextOut使用最后一个参数cchString来确定要打印的字符数。你必须告诉它正确的号码

lpString[in]
指向要绘制的字符串的指针。字符串不需要以零结尾,因为cchString指定字符串的长度

cchString[in]
lpString指向的字符串的长度,以字符为单位


TextOut()
不会停止在空终止符处写入文本,它只会在您指定的时间内继续写入。最后一个参数告诉函数要写入多少个字符。与其给它45,不如给它类似于
strlen(txt.c_str())

简单地阅读文档-字符串不需要以零结尾,因为cbString指定字符串的长度。您必须传递正确的字符串len,但不是45。因此,第五个参数必须与字符串的长度完全匹配?这是故意的吗?难道不可能在没有任何边界检查的情况下创建这种溢出吗?我知道C++并不总是提供这样的保护,但这似乎是一个安全隐患。@ BSD -与语言的选择无关。这是WinApi和您拒绝遵守它的期望的问题
EndPain
。恰当的打字错误。发布真正的代码总是最好的。“我不知道为什么会发生这种情况”-这很奇怪,因为代码非常简洁。“我不是在问一个不合理的问题。”-违反有文档记录的合同并保持任何期望是完全不合理的。更好的是,使用std::string自己的方法,
size()
绝对不要使用
strlen
!因此,为了允许字符串不带\0,API需要字符串的精确长度?这个决定是为了增加lpString?@BSD的灵活性,真的吗?您要求我们了解25年前编写API的API开发人员的想法?我们的精神力量并没有那么强大。