7

GetWindowText函数的返回值记录如下

如果函数成功,则返回值是复制字符串的长度(以字符为单位),不包括终止空字符。如果窗口没有标题栏或文本,如果标题栏为空,或者窗口或控制句柄无效,则返回值为零。要获取扩展错误信息,请调用 GetLastError。

现在,当调用此方法并接收到返回值为零时,我如何知道是否GetLastError会返回一个合理的值?毕竟,零不仅用于表示失败,还可能意味着窗口文本为空,在这种情况下GetLastError不会返回未定义的值。

我自己的想法:

  • 起初,我认为这可能GetWindowText会在成功时将最后一个错误设置为 0。但是测试表明它没有(如果确实如此,我无论如何都不能依赖它,因为这没有记录在案)。
  • 然后,我认为可能GetWindowText会在成功时保持最后一个错误不变,因此在调用之前自己将其设置为 0 可以让我检查最后一个错误是否已更改。测试表明这可能有效,但由于它没有以这种方式证明,我不能依赖它。(我想这在很大程度上取决于具体情况和实施GetWindowText。)
  • 而且,当然,我可以首先使用检查窗口文本长度GetWindowTextLength,然后GetWindowText仅在长度大于 0 时才调用。但是,如果窗口在调用GetWindowTextLength和之间更改其文本GetWindowText怎么办?同样,我不能依赖返回值为零来表示错误。

那么,我该怎么做才能确定是否GetWindowText失败?

4

2 回答 2

4

SetLastError(ERROR_SUCCESS)事先是完全安全和支持的。

last-error 代码的文档清楚地表明,函数可能会或可能不会清除成功时的 last-error 值。然而,可以肯定的是,如果一个函数成功,它将保持最后一个错误值不变,或者将其设置为零,但永远不会将其更改为错误值。

WinAPI函数的实现规则可以概括为:

  1. SetLastError如果没有发生错误,请不要调用。
  2. 如果辅助函数设置了错误代码,但不会导致 API 失败,请调用SetLastError(0)以使非致命内部错误对调用者不可见,或者调用RestoreLastError并将GetLastError入口返回的任何内容传递给 API
  3. 如果您的 API 在没有引发 SEH 异常的情况下失败,请调用SetLastError以报告它(除非辅助函数已经这样做了)。

记录在案的行为“某些函数SetLastError在成功时调用零”是第 2 点的结果。

于 2012-10-23T14:10:33.570 回答
1

是的,您是对的,您实际上无法使用GetLastError()来查看差异。不漂亮。我能想到的唯一解决方法是IsWindow()之后使用。如果返回 TRUE,则返回零实际上意味着“空字符串”。然而,这并不能处理传递错误的缓冲区指针,希望在您的代码中很容易避免。

于 2012-10-23T11:49:26.823 回答