【问题标题】:MFC Dialog Property Sheet usage produces errors in VS 2017, works on VS 2013MFC 对话框属性表使用在 VS 2017 中产生错误,适用于 VS 2013
【发布时间】:2018-11-06 14:31:36
【问题描述】:

有一个现有的Visual Studio 2017 MFC 对话框应用程序项目,其中的控件变得过于密集和复杂,无法添加更多功能。

我想使用一个选项卡式对话框界面来分组和简化控件布局。找到了一些有用的文章,详细介绍了为 Visual Studio 2015 编写的属性页和工作表的用法。

为启动两个选项卡创建了所需的属性页资源,并在我的 Aps 的 .cpp 文件中创建了样式表。编译正常,但在尝试创建对话框时会产生运行时异常:

Utlities.exe 中 0x7786C54F 处未处理的异常:Microsoft C++ 异常:内存位置 0x0040F430 处的 CResourceException。

堆栈窗口对我不是很有帮助。

代码段:

CPropertySheet cSheet;
CConverter convTab; // class for first tab
CYield yieldTab;    // class for second tab
cSheet.AddPage(&convTab);
cSheet.AddPage(&yieldTab);
m_pMainWnd = &cSheet;
INT_PTR nResponse = cSheet.DoModal(); // Exception thrown here

我注意到 CPropertyPage 类显然已被 CMFCPropertyPage 取代,因为 CPropertyPage 在 VS 2017 中不再列为父类。

我认为它可能与CPropertySheet 不兼容。我发现使用 CMFCPropertySheet 很好,但会产生相同的错误。所以我通过并手动从 CPropertyPage 派生了我的属性页,还从 CPropertySheet 派生了工作表。同样的错误。

一时兴起,我启动了一台仍然加载 Visual Studio 2013 的旧计算机,并通过派生 CPropertySheetCPropertyPages 进行了尝试。效果很好。

不知道为什么 VS 2013 有效,而 VS 2017 无效。不愿意仅仅为此将我 2017 年的安装降级到 2015 年。

有什么想法吗?

【问题讨论】:

  • 在调试模式下摩擦它会发生什么?还是崩溃?而且,如果您删除其中一个选项卡会发生什么?看看你能不能找出哪个标签是有问题的。
  • 根据此处docs.microsoft.com/en-gb/cpp/mfc/reference/…,这意味着找不到资源。您是否进行了干净且完整的重建?您的某个页面是否正在使用现在在较新的 IDE 中具有与以前不同的路径的资源?
  • 在显示任何窗口之前,无论是否使用调试器都会崩溃。完全重建没有帮助。使用 Add->New->Resource->Dialog / IDD_PropPage_Large 创建的 PropertyPage。页面的类是使用资源视图中的 ClassWizard 创建的。完整的应用程序是在 VS 2017 上创建的,而不是从以前的版本导入的。我在我的旧机器上安装了 VS 2015,并从头开始重新创建了基本的框架和资源。代码在 2015 年运行良好,在 VS 2017 中打开我在 VS 2015 中制作的框架,它运行没有错误。从头开始在 VS 2017 中重新创建框架,同样的错误。
  • 我认为您应该通过 IDE 支持功能向 Microsoft 提出这个问题。
  • 您尚未展示如何将对话框模板添加到CPropertyPage 驱动类。您只是在确认您确实有对话框模板。应该有类似page1.Construct(IDD_PAGE1); “调用堆栈窗口” 的东西也应该显示详细信息。

标签: c++ mfc modal-dialog visual-studio-2017


【解决方案1】:

遇到了同样的问题,但设法解决了。我在VS 2017。

我的主要代码:

CMFCPropertySheet sheet;
CWizardPage1 page1; // class derived from MFCPropertyPage
CWizardPage2 page2; // class derived from MFCPropertyPage

sheet.AddPage(&page1);
sheet.AddPage(&page2);

sheet.DoModal();

这会在 sheet.DoModal() 处引发相同的 CResourceException。

我为使其工作而进行的更改是在 CWizardPage1 构造函数中(CWizardPage2 类似)。

导致异常的构造函数:

CWizardPage1::CWizardPage1()
{
}

不会导致异常的构造函数:

CWizardPage1::CWizardPage1()
    : CMFCPropertyPage(IDD_WIZARD_PAGE1)
{
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多