0

在将现有 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 的解决方案确实帮助我查明了问题并处理了我目前正在工作的所有此类指针截断。我很幸运:-)

4

2 回答 2

0

正如 HansPassant 在评论中已经说过的那样,除了调试它并跟踪当时应用程序实际尝试执行的操作之外,您几乎无能为力。

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

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

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

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

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

于 2013-02-26T15:34:50.193 回答
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 清单文件,它就开始工作了。

于 2016-03-17T17:17:41.697 回答