【发布时间】:2020-03-17 05:41:08
【问题描述】:
我有一个 c++98 应用程序,它可以在 32 位中正常工作。但在 64 位中,它会随机启动崩溃。也许在 10 次中它不会突然崩溃它会连续崩溃 3 次。
此崩溃发生在创建菜单栏的过程中。这个菜单栏是一个继承自CToolBar的类。
const DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY;
m_menuBar.SetSizes( CSize( 16,15 ), CSize( 1,1 ) );
const BOOL bCreated = m_menuBar.CreateEx( this, TBSTYLE_FLAT | TBSTYLE_LIST, dwStyle, CRect(0,0,0,0), AFX_IDW_TOOLBAR );
最近根据我们经理的决定,我们从 Visual Studio 2010 更新到 Visual Studio 2019,现在崩溃在 64 位中系统地发生,但在 32 位中仍然没有发生。
可能是什么问题?
编辑以添加我的堆栈:
Kernel.dll!000000001f009540()
user32.dll!00007fff7c7c63ed()
user32.dll!00007fff7c7c5fbc()
user32.dll!00007fff7c7d28d3()
ntdll.dll!00007fff7e4dfe14()
win32u.dll!00007fff7c4c1f24()
user32.dll!00007fff7c7b8011()
user32.dll!00007fff7c7b7c04()
user32.dll!00007fff7c7db122()
mfc140d.dll!00007fff3ba05208()
mfc140d.dll!00007fff3b9f4e56()
mfc140d.dll!00007fff3b9f4715()
mfc140d.dll!00007fff3b84a4c3()
d.exe!CDcmMainFrame::CreateMenuBar() Line 1001
d_d.exe!CDcmMainFrame::OnCreate(tagCREATESTRUCTA * lpCreateStruct) Line 925
[External Code]
d_d.exe!CVSDicomApp::InitInstance() Line 3074
[External Code]
d.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow) Line 26
d_d.exe!main(int ac, char * * av) Line 24
[External Code]
【问题讨论】:
-
我已阅读文档。的CMFCMenuBar Class 找到一些我记得从 x86 切换到 x64 时的常见陷阱。我不能。如果
this不符合预期怎么办(即这是对早先发生的其他事情的后续行动)?一个具体的问题,我记得:句柄存储为DWORD,这在 x86 中很好,但在 x64 中可能会中断。这是不正当的,因为句柄可能具有高 32 位为 0 的值。在这种情况下,它可以工作 - 您不会注意到失败。 -
而 在哪里 它到底是在哪里崩溃的?调用堆栈将告诉您崩溃发生在 MFC 中的确切位置。
-
也许您将指针存储为 DWORD 或类似的东西。这是一个经典的。
-
堆栈说它在 CreateEx 行中崩溃...我试图查看所有指针,但似乎并非如此,但也许我跳过了一些内容。应用有点乱。
-
@Jalg 是
this指针吗?还是崩溃实际上是在SetSizes?在那里放一个断点并检查。