【问题标题】:Why would CTreeCtrl DeleteItem fail without an error?为什么 CTreeCtrl DeleteItem 会失败而没有错误?
【发布时间】:2014-06-06 03:55:43
【问题描述】:

Windows 7 VS 2012,C++

我正在调试一个巨大的程序(因此无法跟踪所有可能的路径)。在战略位置放置一些断言后,我得到 MFC DeleteItem() 失败(返回 0)但没有错误(GetLastError() == 0)。

这不是我正在调试的直接问题,但我希望从这个错误中获得关于下一步该去哪里的线索。没有任何错误并且网络上没有任何内容(包括 MSDN)唯一的线索(并且可能是错误的)是它传递了一个错误的 HTREEITEM 值,但是为什么没有错误呢?

【问题讨论】:

  • 如果DeleteItem 失败,这几乎总是意味着(IMO)该项目不存在。尝试预先插入GetItem 以验证存在。
  • 这是个好主意,谢谢。

标签: windows winapi mfc


【解决方案1】:

GetLastError() 的返回值仅在文档告诉您有意义时才有意义,通常在“返回值”部分下。

在这种情况下,它不适用。 CTreeCtrl::DeleteItem method 如果失败则返回 FALSE (0),如果成功则返回非零值。它只是返回 TVM_DELETEITEM message 的结果,框架代表您将其发送到 TreeView 控件。

由您来调试为什么删除项目失败。就像您在问题中提到的那样,最可能的解释是指定的 HTREEITEM 句柄无效。调试这个应该不难。在调用DeleteItem的代码中设置断点,然后运行程序并模拟错误。当执行到达对DeleteItem 的调用时,调试器将进入,您可以调查您即将传入的HTREEITEM 的值。您还可以将值更改为已知有效的值,例如@987654331 @(删除 TreeView 中的所有项目),只是为了确保您正确地查明了罪魁祸首。

【讨论】:

  • DeleteItem 实际上被定义为 SendMessage(TVM_DELETEITEM),而 SendMessage 的文档中有这行让我感到困惑:“当一条消息被 UIPI 阻止时,使用 GetLastError 检索的最后一个错误被设置到 5(拒绝访问)。”
  • @Frigg 是的,我就是这么说的。好的,所以您知道问题不在于 UIPI。这从来都不是一个真正可能的解释。您的进程拥有 TreeView。 UIPI 的一个很好的解释是here
  • 我的评论的意思是,我假设如果该函数完全使用 LastError,它将用于所有错误,而不仅仅是特定的错误(或少数选择的错误)。
猜你喜欢
  • 2016-06-25
  • 1970-01-01
  • 2016-05-06
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多