gpt4 book ai didi

c++ - 在缓冲区溢出时自动截断和 null 终止字符串缓冲区

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:44 25 4
gpt4 key购买 nike

我有以下代码,可以从指定父窗口的所有子窗口加载文本。它工作正常,但有时,有一些父窗口(例如用很长的 C++ 源文件打开的记事本)有大量文本并导致缓冲区溢出。

BOOL CALLBACK EnumChildProc(__in HWND hWnd, __in LPARAM lParam) {

LRESULT TEXT_LENGTH = NULL;
WCHAR szText[32767];
LPWSTR szWindowText;
UINT nBuffer = NULL, nText = NULL;

szWindowText = reinterpret_cast<LPWSTR>(lParam); szText[0] = L'\0';
nBuffer = (UINT)wcslen(szWindowText);
TEXT_LENGTH = SendMessage(hWnd, WM_GETTEXTLENGTH, NULL, NULL);

if (TEXT_LENGTH > NULL)
{
SendMessage(hWnd, WM_GETTEXT, (WPARAM)32767, reinterpret_cast<LPARAM>(&szText));
szText[TEXT_LENGTH] = L'\n'; szText[TEXT_LENGTH + 1] = L'\0';

while ((nBuffer < 32766) && (szText[nText] != L'\0'))
{ szWindowText[nBuffer++] = szText[nText++]; }

szWindowText[nBuffer] = L'\0';
}
return TRUE;
}

SendMessage(hWnd, WM_GETTEXT, (WPARAM)32767, reinterpret_cast<LPARAM>(&szText));有时会导致缓冲区溢出和我的应用程序崩溃。

我知道如何检测像 if (TEXT_LENGTH > 32767) 这样的溢出, 但我不能动态增加缓冲区的大小 szText .

正如问题标题所提到的,我不想增加它的大小,我只想截断和 null 终止返回文本到最大缓冲区大小 32767 (如果 TEXT_LENGTH 超过了 32767 )并将其分配给 szWindowText用于其他目的。

非常感谢任何帮助。

最佳答案

一些事情:

  1. 最好将缓冲区动态分配给 TEXT_LENGTH。 (“\0”+1)
  2. 去掉WM_GETTEXT中szText的&运算符,只需要包含的地址,不需要指针的地址
  3. 当您显式使用 char 时,请使用 SendMessageA,否则 visual studio 默认使用带有 SendMessageW 的 wchar_t。 SendMessage 是一个宏,它根据您的项目设置扩展为 wchar_t 或 char。或者将 TCHAR 类型与 SendMessage 一起使用,它也可以扩展为正确的类型。

DWORD l = SendMessage(hWnd, WM_GETTEXTLENGTH, NULL, NULL);

if (l > 0){
TCHAR *szText = new TCHAR[l + 1];
SendMessage(hWnd, WM_GETTEXT, (WPARAM)l + 1, reinterpret_cast<LPARAM>(szText));

// use szText

delete[] szText;
}

关于c++ - 在缓冲区溢出时自动截断和 null 终止字符串缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45588908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com