如何准确找到调用了哪个类 DoModal() ?
Posted
技术标签:
【中文标题】如何准确找到调用了哪个类 DoModal() ?【英文标题】:How to find exactly from which class DoModal() is called? 【发布时间】:2015-01-07 15:20:12 【问题描述】:我正在使用具有大量对话框的 MFC 应用程序。在调试时我无法判断是哪个类或函数创建了此对话框。
为了说明问题,我创建了一个简单的基于对话框的 MFC 应用程序。在调试模式下运行它并暂停调试。
我可以看到 DoModal 在调用堆栈中使用CDialog::DoModal()
调用。我如何准确了解这个DoModal()
是从哪个函数和哪个类调用的?
【问题讨论】:
你看过堆栈中的上一行了吗?很难从您发布的内容中阅读。或者,您是否尝试过在 DoModal 代码中设置断点? CDialog 是 MFC 类,CDialog::DoModal
是虚函数。上一行并没有准确地告诉我调用了哪个 Dialog。
从我所看到的一点点来看,您似乎有一个基于对话框的应用程序。这意味着对 DoModal 的调用在“CMFCSampleApp”的 InitInstance 方法中。
你是对的,但你能告诉我哪个班级正在处理对话。我的意思是使用 DoModal() 准确显示哪个对话框?
您应该能够通过查看“CMFCSampleApp”的 InitInstance 方法来确定这一点。如果它是一个基于对话框的应用程序,它将调用 DoModal。调用将从实例化类进行。一旦你有了类,查看源代码的类头。它将具有正在加载的对话框资源。
【参考方案1】:
如果在 CDialog 构造函数中设置断点,则更容易找到该类。从那里的调用堆栈中,您将能够看到您的对话框类是什么。
【讨论】:
您的回答在一定程度上缓解了我的解决方案,但并不能完全解决问题。不过 +1,因为它是一个很好的解决方法。【参考方案2】:您可以在CDialog::OnInitDialog()
中设置断点,最终由DoModal()
调用。
OnInitDialog
方法几乎总是被“叶”CDialog 派生类覆盖(尽管不一定),但更重要的是,总是被链接起来。因此,只需将调用堆栈向上移动到对OnInitDialog()
的“第一个”调用,它应该引用该类。
如果它不是“叶子”类,或者它没有被锁住,@JoeWillcoxson 的答案仍然有效。
【讨论】:
以上是关于如何准确找到调用了哪个类 DoModal() ?的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何在多标签类的 SVM 文本分类器算法中找到准确度结果