2013-02-26 182 views
0

在过程迁移到现有的32位MFC代码为64位,我做了成功的构建,并试图对代码进行测试CDialog的:的DoModal崩溃从32迁移后默默地到64位

不幸的是在测试过程中似乎

未按协议栈

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

不转储产生,也没有发生的例外是越来越受SEH

陷入失败(而崩溃) 210

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

在这一刻,我很无能,我应该如何继续。任何形式的帮助是备受期待

异常信息:在0x000007fefd89a5ed(KernelBase.dll)在xyz.exe 第一次机会异常:0x000:为0x1234。

实际的问题

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

+0

所以32位代码的作品,对吧?代码失败的地方在哪里?在CDialog :: DoModal()中?顺便说一句:对CDialog :: DoModal的调用看起来很奇怪。在您发布的3行代码旁边发布更多代码。你有没有从64位编译器得到任何警告?尝试在启用所有警告的情况下重新编译。 – 2013-02-26 12:28:28

+2

这是在将32位代码转换为64位时可能会失败的一件事。通常由将指针存储为int或long引起。你将需要调试它。 – 2013-02-26 12:46:50

+2

说您的应用程序在DoModal()中崩溃无助于确定原因。这就像说你的应用程序在main()中崩溃。在异常处设置断点,以便您可以在发生异常的位置看到本地调用堆栈。对于VS 2008,这有点旧,但它可能有所帮助:http://otb.manusoft.com/2008/05/debugging-objectarx-break-on-exception.htm – 2013-02-27 03:57:46

回答

0

正如HansPassant在评论中已经说过的那样,除了调试它并追踪当时应用程序试图做什么之外,几乎没有什么可做的。

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

如果您有消息来源,请在周围(之前!)致电您引用的相关部分。

如果您没有任何来源,尽量让他们:)

如果你不能让他们,那么你就可以在原始(DIS)的装配调试,但后来,你需要引用的不仅是主体部分,还有注册和堆叠的价值观......好吧,很难得到观众的可能性。

很难多说什么,因为目前我/我们知道即使你的情况比你少:)

+0

我明白你的观点。我只是想收集集体经验来获得一些提示。关于消息来源,我确实拥有它,但它的知情权让我在分享它时要小心:-)。我将再次切换回我的调试器并报告我有的任何更新 – Abhijit 2013-02-26 15:41:18

0

我刚做了一个非常类似的问题。与之前一样,在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清单文件,并开始工作。