关于C#:MFC对话框属性表的使用在VS 2017中产生错误,可在VS 2013上使用

MFC Dialog Property Sheet usage produces errors in VS 2017, works on VS 2013

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

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

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

Unhandled exception at 0x7786C54F in Utlities.exe: Microsoft C++
exception: CResourceException at memory location 0x0040F430.

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

代码段:

1
2
3
4
5
6
7
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.

有什么想法吗?


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

我的主要代码:

1
2
3
4
5
6
7
8
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相似)。

导致异常的构造函数:

1
2
3
CWizardPage1::CWizardPage1()
{
}

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

1
2
3
4
CWizardPage1::CWizardPage1()
    : CMFCPropertyPage(IDD_WIZARD_PAGE1)
{
}