Windows 为什么CTreeCtrl DeleteItem会在没有错误的情况下失败?

Windows 为什么CTreeCtrl DeleteItem会在没有错误的情况下失败?,windows,winapi,mfc,Windows,Winapi,Mfc,视窗7 VS 2012,C++ 我正在调试一个巨大的程序(因此无法跟踪所有可能的路径)。在将一些断言放在战略位置之后,我发现MFC DeleteItem()失败(返回0),但没有错误(GetLastError()==0) 这并不是我正在调试的直接问题,但我希望从这个错误中获得线索,以便下一步查找。没有任何错误,web上也没有任何内容(包括MSDN),唯一的线索(可能是错误的)是它传递了错误的HTREEITEM值,但为什么没有错误?GetLastError()的返回值只有在文档告诉您它是时才有意义

视窗7 VS 2012,C++

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


这并不是我正在调试的直接问题,但我希望从这个错误中获得线索,以便下一步查找。没有任何错误,web上也没有任何内容(包括MSDN),唯一的线索(可能是错误的)是它传递了错误的HTREEITEM值,但为什么没有错误?

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

在这种情况下,它不适用。如果失败,则返回
FALSE
(0),如果成功,则返回非零。它只是返回一个结果,框架代表您将该结果发送给TreeView控件


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

如果
DeleteItem
失败,这几乎总是意味着(IMO)该项目不存在。尝试事先插入一个
GetItem
来验证是否存在。这是一个好主意,谢谢。DeleteItem实际上被定义为SendMessage(TVM_DeleteItem),SendMessage的文档中有一行让我困惑的内容:“当UIPI阻止消息时,使用GetLastError检索的最后一个错误被设置为5(拒绝访问)。@Frigg Yes,我就是这么说的。好吧,你知道问题不在于UIPI。这根本不是一个可能的解释。您的进程拥有TreeView。对UIPI的一个很好的解释是,我的评论的意思是,我假设如果函数使用LastError,它将对所有错误使用它,而不仅仅是一个特定的错误(或一些选定的错误)。