【发布时间】:2013-02-05 19:56:09
【问题描述】:
给定一个 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;
上面的代码有效,但我有以下问题:
缓冲区大小完全是任意的,因为我无法知道函数可能返回的字符串的长度。这对我来说“感觉”是错误的——我一直试图在我的代码中避免使用幻数。
如果函数返回的字符串大于缓冲区,它将被截断 - 这很糟糕!
每当函数返回一个小于缓冲区的字符串时,我都会浪费内存。这并不像(2)那么糟糕,但我对为实际上可能只需要几个字节的东西留出大块内存(例如上面示例中的 1024 字节)的想法并不感到兴奋。
还有其他选择吗?
【问题讨论】:
-
天哪……你是真正的乔恩·宾利吗?
-
您应该使用
_countof,而不是sizeof- 所需的参数是最大字符数,而不是字节数。否则,没有,没有比你使用它更好的方法了——尽管“浪费”几百字节的堆栈并不是什么大问题,如果你想回收立即堆叠。 -
您可以使用
GetWindowTextLength()来确定字符串的长度并分配适当大小的缓冲区。 -
@Pete 谢谢,如果您将其作为答案发布,我会投赞成票,因为它对于我给出的具体示例来说是一个很好的例子,如果不是一般问题的话。
-
为什么不
std::wstring title(buffer)?