CDialog :: DoModal在从32位迁移到64位后无声地崩溃

时间:2013-02-26 11:28:21

标签: c++ windows visual-studio-2010 visual-studio mfc

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

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

堆叠失败

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

没有生成转储,也没有生成的异常被SEH捕获

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

此刻我无法理解我应该如何继续。任何形式的帮助都备受期待

例外信息     xyz.exe中0x000007fefd89a5ed(KernelBase.dll)的第一次机会异常:0x00001234:0x1234。

实际问题

实际问题是由于指针截断导致其崩溃。 @ OwenWengered的解决方案确实帮助我查明问题并处理我目前正在工作的所有这样的指针截断。哪个我好运: - )

2 个答案:

答案 0 :(得分:0)

就像HansPassant在评论中已经说过的那样,除了调试它并追踪当时应用程序试图做的事情之外,你几乎没有其他事情可做。

为了完全启动,“0x1234”值似乎非常奇怪。如果您有源,请找到有问题的行并在那里设置断点。然后,一旦命中,检查哪些值(hinst?lpdialogtemplate?pParentWnd?)可能已被修剪为0x1234。在您的调试会话中,值1234可能会有所不同,因此请小心并检查任何看起来很奇怪的指针,即。太小或看起来不对齐。

如果您有消息来源,请张贴相关部分(之前!),然后给您打电话。

如果您没有任何来源,请尝试获取它们:)

如果你不能得到它们,那么你可以在原始(dis)程序集中进行调试,但是,你不仅需要引用asm部分,还需要引用寄存器和堆栈值......好吧,它会难以听取观众的意见。

很难说更多,因为目前我/我们对你的情况的了解比你更少:)

答案 1 :(得分:0)

我刚才有一个非常相似的问题。在不久前,在VS6中进行编码时,您可以创建一个清单文件(在资源下)来更改对话框的外观,使其具有WinXP对话框外观(带有圆边)。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0008a/ch01s02s01.html

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

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

0x000007FEFC94965D(KernelBase.dll)抛出异常

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