为啥 Windows API 响应错误代码取决于我的日志记录语句
Posted
技术标签:
【中文标题】为啥 Windows API 响应错误代码取决于我的日志记录语句【英文标题】:Why does the Windows API respond with error codes depending on my logging statements为什么 Windows API 响应错误代码取决于我的日志记录语句 【发布时间】:2018-06-05 14:55:16 【问题描述】:我有一些代码来获取窗口句柄,然后获取它的矩形。
HWND hWnd = FindWindow("CalcFrame", NULL);
LPRECT rect;
int retval = GetWindowRect(hWnd, rect);
if (retval == 0)
DWORD error = GetLastError();
std::cout << error << "\n";
else
std::cout << "FindWindow/GetWindowRect Success" << "\n";
此代码工作正常,当我没有日志记录语句时,这些值存储在 rect 中。当我在...之后直接添加此日志记录语句时...
std::cout << rect->left << "," << rect->top << "," << rect->right << "," << rect->bottom << "\n";
我从GetLastError()
winapi 方法得到一个错误(错误代码1400),表明我们找不到窗口句柄并获取窗口矩形。
当我使用这个日志语句时,我没有收到任何错误。
std::cout << "Right: " << rect->right << "\n";
std::cout << "Bottom: " << rect->bottom << "\n";
这可能是什么原因?
【问题讨论】:
rect
未初始化,您正在破坏随机内存并且具有未定义的行为。您需要提供RECT
结构的地址来存储值。
将LPRECT
更改为RECT
和GetWindowRect(hWnd, &rect);
。您需要传递现有 RECT 结构的地址。
感谢@JonathanPotter,您的问题是正确的。我希望您将其发布为答案:)
【参考方案1】:
正确的代码是:
RECT rect;
int retval = GetWindowRect(hWnd, &rect);
GetWindowRect
需要一个指向现有结构的指针。
【讨论】:
使用 RECT rect 有什么不同吗?或 RECT rect = 0 ?我在另一个答案中看到了后者。 @TylerNichols -rect
这里只有参数。不需要初始化它
对于我的第一条评论 ***.com/questions/88957/… 是相关的。
@TylerNichols - 那又怎样?我们可以写和RECT rect =
,但GetWindowRect
不看也不使用——在调用之前&rect
中的内容。它在这里存储数据。结果只需要RECT rect
而无需任何初始化。
@TylerNichols 始终初始化变量是一个好习惯,因此即使程序员稍后在代码中出错(例如使用该值而不检查 @987654329 的返回值),也始终存在已定义的状态@ 或 GetWindowRect()
中的错误 ...在这种情况下不太可能发生,但可能适用于更复杂的 API)。尝试使用未初始化的变量调试代码可能会让人头疼(通常只在客户机器上崩溃,从不在开发机器上崩溃)。顺便说一句,使用 C++11,您可以省略零甚至赋值运算符(例如 RECT rect;
将零初始化)。以上是关于为啥 Windows API 响应错误代码取决于我的日志记录语句的主要内容,如果未能解决你的问题,请参考以下文章
开发服务器返回响应错误代码:500 react-native 为啥这个错误谁能告诉我