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, он запускается...

РЕШИТЬ

Я обновил свой графический драйвер, и все отлично работает.

1 ответ

Решение

Я обновил свой графический драйвер, и все отлично работает.

Другие вопросы по тегам