gpt4 book ai didi

c++ - MFC CDialog::Create 在 x64 上挂起

转载 作者:太空宇宙 更新时间:2023-11-04 13:55:12 27 4
gpt4 key购买 nike

我有这个遗留应用程序,我一直在尝试启动并运行它。

它对只能安装在 WinXP(或更早版本)上的旧 DirectX SDK 版本有一些依赖性,因此我使用了我的虚拟机并成功构建了应用程序。但是,由于虚拟图形硬件的限制,应用程序无法正确呈现其图形,但这只是预料之中的。应用程序的其余部分(UI 交互等)似乎在虚拟机(32 位 Windows XP)上运行良好。

当我尝试在我的物理机(64 位 Windows 7)上运行该应用程序时,它在早期状态下挂起。我使用了一些调试输出来准确追踪它挂起的位置,也就是在调用 CDialog::Create 以创建无模式对话框时。

我终于尝试在我的 32 位 Windows 8.1 笔记本电脑上启动它,它成功了。我认为它应该与 x86 和 x64 有关,但我当然不能确定。

有人遇到过类似的事情吗?我在 CDialog::Create hanging 上进行了很多搜索,并发现了一些有趣的线程,但代码中的一切看起来都是正确的,而且它可以运行,但只能在 32 位机器上运行。

更新:

我通过删除一堆代码设法在 VS2010 中构建应用程序。当我调试应用程序时,调用堆栈显示它卡在 CWnd::CreateDlgIndirect 中的 CreateDialogIndirect 调用上。

我找到了 a thread regarding this , 但它没有解决任何问题,正在调用 AfxOleInit。

This discussion听起来更有趣,但我还没有抽空尝试建议的解决方案。

更新 2:

将 DEP 设置为 AlwaysOff 没有任何改变。

完整的调用栈如下所示:

ntdll.dll!_NtDelayExecution@8()  + 0x15 bytes   
ntdll.dll!_NtDelayExecution@8() + 0x15 bytes
KernelBase.dll!_Sleep@4() + 0xf bytes
nvoglv32.dll!6955244d()
[Frames below may be incorrect and/or missing, no symbols loaded for nvoglv32.dll]
nvoglv32.dll!68e3e2e7()
nvoglv32.dll!6954d2ad()
nvoglv32.dll!6954d37c()
user32.dll!_DispatchHookA@16() + 0x56 bytes
user32.dll!_fnHkINLPCWPSTRUCTA@24() + 0x66 bytes
user32.dll!___fnINLPCREATESTRUCT@4() + 0x68 bytes
ntdll.dll!_KiUserCallbackDispatcher@12() + 0x2e bytes
user32.dll!_NtUserCreateWindowEx@60() + 0x15 bytes
user32.dll!_VerNtUserCreateWindowEx@52() + 0x18a bytes
user32.dll!_InternalCreateDialog@28() + 0x42a bytes
user32.dll!_CreateDialogIndirectParamAorW@24() + 0x33 bytes
user32.dll!_CreateDialogIndirectParamA@20() + 0x1b bytes
Viewer.exe!CWnd::CreateDlgIndirect(const DLGTEMPLATE * lpDialogTemplate, CWnd * pParentWnd, HINSTANCE__ * hInst) Line 370 C++
Viewer.exe!CDialog::CreateIndirect(const DLGTEMPLATE * lpDialogTemplate, CWnd * pParentWnd, void * lpDialogInit, HINSTANCE__ * hInst) Line 262 + 0x17 bytes C++
Viewer.exe!CDialog::CreateIndirect(void * hDialogTemplate, CWnd * pParentWnd, HINSTANCE__ * hInst) Line 240 + 0x10 bytes C++
Viewer.exe!CDialog::Create(const char * lpszTemplateName, CWnd * pParentWnd) Line 223 C++
Viewer.exe!CToolDialog::CreateModeless(CWnd * pParent) Line 41
Viewer.exe!CMainFrame::CreateTools() Line 176 + 0x17 bytes C++
Viewer.exe!CViewerApp::OnIdle(long lCount) Line 1293 C++
Viewer.exe!CWinThread::Run() Line 621 + 0xa bytes C++
Viewer.exe!AfxWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow) Line 47 + 0x7 bytes C++
Viewer.exe!__tmainCRTStartup() Line 275 + 0x1c bytes C
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes

更新 3

该应用程序通常使用 C# 启动器应用程序启动(以便能够选择用户配置文件和其他启动设置)并以这种方式启动它挂起。此外,从它挂起的文件资源管理器(或命令提示符)启动它。但是,如果我使用 F5 直接从 VS2010 启动它,它会运行...

已解决

我更新了图形驱动程序,一切正常。

最佳答案

我更新了图形驱动程序,一切正常。

关于c++ - MFC CDialog::Create 在 x64 上挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21797453/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com