MFC CDialog:: Создание зависаний на x64
У меня есть это устаревшее приложение, которое я пытался запустить и запустить.
Он имеет некоторые зависимости от старой версии DirectX SDK, которую можно установить только на WinXP (или более раннюю версию), поэтому я использовал мою виртуальную машину и успешно скомпилировал приложение. Тем не менее, из-за ограничений виртуального графического оборудования, приложение не отображает графику правильно, но это было ожидаемым. Остальная часть приложения (UI-взаимодействие и т. П.), Кажется, прекрасно работает на виртуальной машине (32-битная Windows XP).
Когда я пытаюсь запустить приложение на моей физической машине, 64-битной Windows 7, оно зависает в раннем состоянии. Я использовал вывод отладочной информации, чтобы точно отследить, где он зависает, и именно тогда вызывается CDialog::Create для создания немодального диалога.
Я наконец попытался запустить его на своем ноутбуке, 32-битной Windows 8.1, и это сработало. Я думаю, что это должно быть как-то связано с x86 против x64, но, конечно, я не уверен.
Кто-нибудь сталкивался с чем-то похожим? Я много гуглил на CDialog::Create зависания и нашел несколько интересных тем, но в коде все выглядит правильно, и хорошо, что он работает, но только на 32-битных машинах.
Обновить:
Мне удалось построить приложение в VS2010, удалив кучу кода. Когда я отлаживаю приложение, стек вызовов показывает, что оно зависает при вызове CreateDialogIndirect в CWnd::CreateDlgIndirect.
Я нашел поток, касающийся этого, но это ничего не решило, вызывается AfxOleInit.
Это обсуждение звучит более интересно, но я пока не успел попробовать предложенное решение.
Обновление 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# (чтобы иметь возможность выбирать профили пользователей и другие параметры запуска) и запускает его так, как оно зависает. Кроме того, при запуске из проводника (или командной строки) он зависает. НО, если я запускаю его напрямую с VS2010, используя F5, он запускается...
РЕШИТЬ
Я обновил свой графический драйвер, и все отлично работает.