From baaf30b3877cf5495a77aa6dc533d81977e5d40d Mon Sep 17 00:00:00 2001 From: Masaru Tsuchiyama Date: Sat, 2 Feb 2019 22:53:19 +0900 Subject: [PATCH] =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=83=81=E3=82=A7?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/apiwrap/StdControl.h | 46 +++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/sakura_core/apiwrap/StdControl.h b/sakura_core/apiwrap/StdControl.h index 1ad45a8be8..22718c974d 100644 --- a/sakura_core/apiwrap/StdControl.h +++ b/sakura_core/apiwrap/StdControl.h @@ -75,9 +75,10 @@ namespace ApiWrap{ @brief Window テキストを取得する @param[in] hwnd ウィンドウハンドル @param[out] str ウィンドウテキスト - @return 文字数 (NULL文字含む) + @return 成功した場合 true + @return 失敗した場合 false */ - inline int Wnd_GetText(HWND hwnd, CNativeT& str) + inline bool Wnd_GetText(HWND hwnd, CNativeT& str) { // バッファをクリアしておく str.Clear(); @@ -86,6 +87,13 @@ namespace ApiWrap{ // 条件によっては必要なサイズより大きな値を返すことがある模様 // https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowtextlengtha const int length = ::GetWindowTextLength(hwnd); + if (length < 0) + { + // ドキュメントには失敗した場合、あるいはテキストが空の場合には 0 を返すとある。 + // 0 の場合はエラーかどうか判断できないのでテキストの取得処理を続行する。 + // 仕様上は負の場合はありえないが、念の為エラーチェックしておく。 + return false; + } // ドキュメントには NULL 文字に関して言及がないので念の為 +1 しておく const int bufsize = length + 1; @@ -97,18 +105,36 @@ namespace ApiWrap{ } int actualCount = ::GetWindowText(hwnd, str.GetStringPtr(), str.capacity()); - if (actualCount > 0) + if (actualCount < 0) + { + // 仕様上は負の場合はありえないが、念の為エラーチェックしておく。 + return false; + } + else if (actualCount == 0) + { + // GetWindowText はエラーの場合、またはテキストが空の場合は 0 を返す + if (GetLastError() != 0) + { + return false; + } + } + else if(actualCount < str.capacity()) { assert(actualCount <= bufsize); + } + else + { + // 仕様上はありえないはず + return false; + } - // Win32 API の GetWindowText() を呼んだだけでは CNativeT 内部の - // データサイズが更新されないのでデータサイズを反映する - str._SetStringLength(actualCount); + // Win32 API の GetWindowText() を呼んだだけでは CNativeT 内部の + // データサイズが更新されないのでデータサイズを反映する + str._SetStringLength(actualCount); - // 正しく設定されているはず - assert(str.GetStringLength() == actualCount); - } - return actualCount; + // 正しく設定されているはず + assert(str.GetStringLength() == actualCount); + return true; } // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //