c++ - 使用使用 C 样式字符串作为 OUT 参数的 WinAPI 函数

标签 c++ winapi cstring out

给定一个 WinAPI 函数,该函数通过 C 样式字符串 OUT 参数返回结果,例如:

int WINAPI GetWindowTextW(
   _In_   HWND hWnd,
   _Out_  LPTSTR lpString,
   _In_   int nMaxCount
);

有没有比我在下面做的更好的函数使用方法?

HWND handle; // Assume this is initialised to contain a real window handle
std::wstring title;
wchar_t buffer[512];
GetWindowTextW(handle, buffer, sizeof(buffer));
title = buffer;

上面的代码有效,但我有以下问题:

  1. 缓冲区大小完全是任意的,因为我无法知道函数可能返回的字符串的长度。这对我来说“感觉”不对 - 我一直试图避免在我的代码中使用魔数(Magic Number)。

  2. 如果函数返回的字符串大于缓冲区,它将被截断 - 这很糟糕!

  3. 只要函数返回的字符串小于缓冲区,我就会浪费内存。这不像 (2) 那样糟糕,但我对为实际可能只需要几个字节的东西预留大块内存(例如我上面的示例中的 1024 字节)的想法并不感到兴奋。

还有其他选择吗?

最佳答案

使用不同大小的临时缓冲区多次调用该函数。从一个缓冲区开始,比方说,8。将缓冲区大小加倍并再次调用它。重复直到它返回与上次相同的计数。然后你可以分配确切大小的缓冲区并复制你在那里的内容。有许多具有类似行为的 Win32 函数。

您可以使用 GetWindowTextLength(),但如果存在竞争条件,它可能无济于事(您可能会因此而得到截断的文本)。

关于c++ - 使用使用 C 样式字符串作为 OUT 参数的 WinAPI 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14715848/

相关文章:

c++ - 知道 istream 是否以 C++ 中的字符串开头的惯用方法?

c++ - 有人可以解释一下 openCV 中的 detectMultiScale

c++ - 求和 std::vector 是使用引用而不是值?

c++ - Qt grabWindow 坐标从 GetCursorPos 和 GetWindowRect 转移

c++ - 安装 MS Office2003 后调用 SHFileOperation 删除文件时出现奇怪的结果

c++ - 在 C++ 中将 long 转换为 CString

c++ - 将 BSTR 转换为 CString 时出错

c++ - 如何在我的软件中配置中文支持?

C++ 和 Windows : Is SYSTEMTIME always based on the Gregorian calendar?

c++ - Strcmp 未按预期运行,比较两个不相等的字符串时返回 0