从32位迁移到64位后,DoModal静默崩溃

CDialog::DoModal crashes silently after migration from 32 to 64bit

本文关键字:DoModal 静默 崩溃 64位 32位 迁移      更新时间:2023-10-16

在将现有的32位MFC代码迁移到64位的过程中,我做了一个成功的构建并尝试测试代码

不幸的是,当测试过程似乎失败(而不是崩溃)在

失败堆栈

hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate,  pParentWnd->GetSafeHwnd(), AfxDlgProc);
CreateDlgIndirect(lpDialogTemplate, CWnd::FromHandle(hWndParent), hInst)
CDialog::DoModal()

不生成Dump,生成的异常也不会被SEH捕获

我尝试将调试运行与现有的Win32调试运行进行比较,但无法找到任何显着差异

此刻我不知道该怎么做。我们非常期待任何形式的帮助 异常信息:

在xyz.exe中0x000007fefd89a5ed (KernelBase.dll)的第一次机会异常:0x00001234: 0x1234.

实际问题

实际问题是由于指针截断导致它崩溃。@OwenWengered的解决方案确实帮助我找到了问题,并处理了我目前正在工作的所有指针截断问题。我很幸运:-)

正如HansPassant在评论中已经说过的那样,除了调试它和跟踪应用程序当时实际试图做的事情之外,您几乎没有什么可以做的。

对于完全启动,"0x1234"值看起来非常奇怪。如果您有源代码,找到有问题的行并在那里设置断点。然后,一旦命中,检查哪个值(hinst?)lpdialogtemplate吗?)可能被修剪为0x1234。在调试会话中,值1234可能会有所不同,所以要小心并检查任何看起来奇怪的指针,即。字体太小或看起来没有对齐。

如果你有出处,把你引用的电话的相关部分贴出来。

如果你没有任何资源,试着去获取它们:)

如果你不能得到它们,那么你可以在原始(dis)汇编中进行调试,但是,你不仅需要引用asm部分,还需要引用寄存器和堆栈值。嗯,这可能很难吸引观众。

很难再多说什么了,因为目前我/我们对你的情况了解得比你还少:)

我刚刚遇到了一个非常类似的问题。很久以前,在VS6中编写代码时,您可以创建一个清单文件(在资源下)来更改对话框的外观,使其具有WinXP对话框的外观(带有圆角)。

https://msdn.microsoft.com/en-us/library/aa289524%28v=vs.71%29.aspx

所以我在资源中的RT_MANIFEST下有一个名为IDR_WIN_XP_THEME的文件。

我能够升级到所有版本的Visual Studio。但是当我在VS2015中将应用程序转换为64位并试图以64位打开应用程序时,它失败了,出现了异常错误。

0x000007FEFC94965D (KernelBase.dll)抛出异常

我刚刚删除了IDR_WIN_XP_THEME清单文件,它开始工作了