Cスタイルの文字列OUTパラメータを介して結果を返すWinAPI関数を指定します。例:
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バイト)を確保するというアイデアにはわくわくしません。
他に選択肢はありますか?