我的代码是Visual Studio 2017下的C ++。它在VS2013下正常工作,但是升级到VS2017后在32位版本中失败(但仍在64位版本中工作)。
class DerivedFluentUI: public SFLFluentUI
{
friend CMainFrame;
protected:
virtual BOOL ImplCaptionBar (CWnd* pParentWnd);
virtual BOOL ImplRibbonBar (CWnd* pParentWnd, BOOL bCreateAppButton = TRUE, BOOL bCreateBackstageFileTab = FALSE) {return m_wndRibbonBar.Create(pParentWnd);}
};
已删除很多代码(长200行)的基类是:
class SFLFluentUI
{
protected:
virtual BOOL ImplRibbonBar(CWnd* pParentWnd, BOOL bCreateAppButton = TRUE, BOOL bCreateBackstageFileTab = FALSE);
virtual BOOL ImplCaptionBar(CWnd* pParentWnd);
SFLRibbonBarEx m_wndRibbonBar;
SFLCaptionBarEx m_wndCaptionBar;
};
在DerivedFluentUI :: ImplCaptionBar中,我打电话(除其他外):
m_wndCaptionBar.Create (...)
以32位版本崩溃。
当我在调试器中进入对m_wndCaptionBar.Create
的调用时,我发现“ this”指针不等于m_wndCaptionBar
的地址(从ImplCaptionBar
看)。上次我检查时,它们分别是0x10d46538和0x10d46530,所以相隔8个字节。
如果我进入DerivedFluentUI::ImplRibbonBar()
中与m_wndRibbonBar.Create
的类似调用,则“ this”指针与m_wndRibbonBar
的地址相同,并且成功执行。
陌生人仍然,如果我在64位版本中执行此操作,那么这一切都按预期工作,并且对m_wndCaptionBar.Create
的调用中的“ this”指针等于&m_wndCaptionBar
(从DerivedFluentUI::ImplCaptionBar
)。
如果我从__super::ImplCaptionBar (...)
调用m_wndCaptionBar.Create
(本身称为DerivedFluentUI::ImplCaptionBar
),那么即使在32位版本中,它也可以正常工作。
我显然误会了一些东西,因为我不知道为什么会这样。
帮助?!
根据请求进行编辑: DerivedFluentUI没有构造函数或析构函数,只是覆盖了这两个虚函数。
SFLFluentUI基类的构造函数:
SFLFluentUI::SFLFluentUI(void)
{
m_pMainPanel = NULL;
m_bLoadedFromResource = FALSE;
m_bRibbonInitialized = FALSE;
m_bFreqCmdPanels = FALSE;
m_bFreqCmdPanelsInitialized = FALSE;
m_bIsUsingMainApplicationButton = FALSE;
m_bIsBackstageFileTabCreated = FALSE;
m_pBackstagePropertySheet = NULL;
m_bIsBackstageFileWindowVisible = FALSE;
m_bRibbonMinimizedBeforeBackstage = FALSE;
m_bHasSysMenu = FALSE;
if (NULL == g_FluentUI)
{
g_FluentUI = this;
}
}
**编辑12/6/2018
这使用了RogueWave的Stingray库。我能够在他们的样本中重现该样本,这与我们正在谈论的大型UI库的样本一样少。将其发布在这里没有多大意义,因为您需要他们的库来运行它,但这确实意味着我可以参与RogueWave技术支持。
当他们/我们弄清楚某些东西时,我会更新情况。
**编辑2018年12月7日
崩溃似乎与操作系统有关。
Windows 7:不会崩溃(在2台计算机上测试)
Windows 10:崩溃(在2台计算机上测试,第3个待处理) Windows Server 2012:崩溃(在1台计算机上测试)
我会进行更新,以防万一有人给我一些晦涩的环境,或者可能是我可能会提出的吟或咒语。在我看来,高呼似乎是一门好科学(尽管我必须承认对我的机器大喊并不能解决问题……)。
**编辑4/3/2019
我从来没有想过。最终放弃并重新设计了一些东西以避免使用DerivedFluentUI,而是修改了Stingray库中的代码以执行我想要的操作。我对此不满意,但是...
如果有人对此有所了解,请更新此案例。我很想知道这个问题。