如何准确找到调用了哪个类 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() ?的主要内容,如果未能解决你的问题,请参考以下文章

哪个是 mvc 组件图的准确方法?

vc编程DoModal弹不出对话框

MFC怎么调用其它窗口

Python:如何在多标签类的 SVM 文本分类器算法中找到准确度结果

使用 DoModal 调用时,对话框不显示 CListBox 内容

如何以编程方式确定哪个类/模块定义了被调用的方法?