为啥 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 更改为RECTGetWindowRect(hWnd, &amp;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 不看也不使用——在调用之前&amp;rect 中的内容。它在这里存储数据。结果只需要RECT rect 而无需任何初始化。 @TylerNichols 始终初始化变量是一个好习惯,因此即使程序员稍后在代码中出错(例如使用该值而不检查 @987654329 的返回值),也始终存在已定义的状态@ 或 GetWindowRect() 中的错误 ...在这种情况下不太可能发生,但可能适用于更复杂的 API)。尝试使用未初始化的变量调试代码可能会让人头疼(通常只在客户机器上崩溃,从不在开发机器上崩溃)。顺便说一句,使用 C++11,您可以省略零甚至赋值运算符(例如 RECT rect; 将零初始化)。

以上是关于为啥 Windows API 响应错误代码取决于我的日志记录语句的主要内容,如果未能解决你的问题,请参考以下文章

为啥myeclipse经常未响应

开发服务器返回响应错误代码:500 react-native 为啥这个错误谁能告诉我

REST API 响应取决于发出请求的人

为啥要使用托管(C# 和 .NET)或本机代码进行 Windows API 开发?

为啥我的微 API 没有响应体?

为啥我从 API 调用中得到太多响应