在使用WinAPI时,你经常会遇到一些方法需要将LPWSTR或LPSTR作为参数传递。有时这个指针实际上应该是指向缓冲区的指针,例如:
int GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount);
对于这样的缓冲区,使用std::wstring
是否是一个好主意呢?在特定情况下,我强烈需要产生std::wstring
作为结果,不能用vector<wchar_t>
等替代方法吗?
std::wstring myWrapper(HWND hWnd){
auto desiredBufferSize = GetWindowTextLengthW(hWnd);
std::wstring resultWstr;
resultWstr.resize(desiredBufferSize);
auto ret = GetWindowText(hWnd,
const_cast<wchar_t*>(resultWstr.data()), // const_cast
resultWstr.size());
// handle return code code
return resultWstr;
}
data()
和 c_str()
字符串方法返回 const 指针,因此我们必须使用 const_cast
来移除 constness,但有时这是一个不好的信号。在这种情况下这样做是否明智?我能做得更好吗?
&str[0]
,只有在 C++11 中才能保证正常运作。 - chrishWnd
的线程调用,两次调用之间长度可能会发生更改... 如果标准容器有一种方法可以在不设置新元素的情况下增长到指定大小,那就太好了... - DeduplicatorGetWindowTextLength
返回长度(据我所知,不包括终止的空字符)。GetWindowText
将其第三个参数作为缓冲区字符计数,包括终止的空字符。std::basic_string
(在>= C++11中)不允许修改终止的空字符,因此你必须为此额外留出空间。(这意味着你最终会得到两个空字符,所以basic_string
可能不是最好的工具。) - dyp