Учитывая функцию WinAPI, которая возвращает результат через параметр OUT строки в стиле C, например:
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
- требуемый параметр - это максимальное количество символов, а не количество байтов. В противном случае нет, на самом деле нет лучшего способа, чем то, как вы его используете, хотя потеря нескольких сотен байтов стека на самом деле не является серьезной проблемой, и вы всегда можете обернуть этот код в {}, если хотите немедленно восстановить стек . - person Jonathan Potter   schedule 06.02.2013GetWindowTextLength()
, чтобы определить длину строки и выделить буфер соответствующего размера. - person Pete   schedule 06.02.2013std::wstring title(buffer)
? - person Pavel Radzivilovsky   schedule 06.02.2013std::string title(narrow(std::wstring(title(buffer))));
для лучшей обработки юникода. (что означает UTF-8. utf8everywhere.org) - person Pavel Radzivilovsky   schedule 06.02.2013title
уже существует в другом месте. - person JBentley   schedule 06.02.2013