从32位迁移到64位后,DoModal静默崩溃
CDialog::DoModal crashes silently after migration from 32 to 64bit
在将现有的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清单文件,它开始工作了
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 如何使jse文件执行编码.exe并静默添加启动?Javascript将文件添加到启动?
- DoModal 主应用程序随机返回 -1 代码
- 如何将静默音频数据写入音频流
- 程序似乎在 for 循环 - C++后静默终止
- 标准目录中包含的文件可以静默替换现有宏
- 编译器可以静默地从 const 转换为 const 和,反之亦然吗?
- 如果 QApplication 执行延迟,QWebEngineView 在加载内容时会以静默方式失败
- 防止从false到指针的静默强制转换
- DoModal 返回 -1 Getlasterror 说句柄无效
- 为什么我的C++程序在使用 NULL 对象时静默退出
- 当ReadConsoleOutputCharacterW返回的字符串具有特定长度时,wcslen会静默退出
- 静默接受.pfx证书
- MFC 应用程序 Dialog基于使用 propertyPage,DoModal() for a CDialog 不打开任何对话框
- 火鸟/IBPP 插入以静默方式失败
- 程序以静默方式关闭
- MFC 应用程序以静默方式关闭
- 如何获取视觉C++警告 int 到字符串的静默转换
- OpenCV imread静默失败的原因
- 从32位迁移到64位后,DoModal静默崩溃