我正在创建一个简单的 Direct2D 应用程序。不幸的是它正在给予
未处理的异常。它发生的函数:
void DemoApp::OnResize(UINT width, UINT height)
{
if (m_pRenderTarget) <----|****The exception occurs here.....****
{
// Note: This method can fail, but it's okay to ignore the
// error here, because the error will be returned again
// the next time EndDraw is called.
m_pRenderTarget->Resize(D2D1::SizeU(width, height));
}
}
调用 OnResize() 的代码片段是:
DemoApp *pDemoApp = reinterpret_cast<DemoApp *>(static_cast<LONG_PTR>(
::GetWindowLongPtrW(
hwnd,
GWLP_USERDATA
)));
bool wasHandled = false;
if (pDemoApp)
{
switch (message)
{
case WM_SIZE:
{
UINT width = LOWORD(lParam);
UINT height = HIWORD(lParam);
pDemoApp->OnResize(width, height);
}
result = 0;
wasHandled = true;
break;
/*rest of switch case*/
}
异常说:Simple Direct2D application.exe 中 0x00007FF6BE402CCA 处未处理的异常:0xC000041D:用户回调期间遇到未处理的异常。发生
异常截图:
当我开始调试程序时,它就给出了异常。我什至从网站上逐字复制了程序。由于我是 DirectX 世界的新手,我对异常一无所知。我应该怎么办?
我已经编译了该示例。它可以在 32 位版本中运行,在 64 位版本中崩溃。
该错误出现在 Microsoft 的示例代码中,与 Direct2D 无关。
他们通过this
into SetWindowLongPtr
,结合PtrToUlong
用于类型转换的宏。在 64 位版本中,this
长度为 8 个字节,SetWindowLongPtr
也接受 8 个字节,但是PtrToUlong
宏转换为unsigned long
只有 4 个字节。所以PtrToUlong
宏从以下位置删除高 4 个字节this
指针,应用程序彻底失败。
您可以通过更换来修复PtrToUlong( pDemoApp )
with (LONG_PTR)pDemoApp
附:我认为根本原因是,MS极力假装Win32平台已经过时,将开发者推向UWP。这就是为什么在他们的 DirectX 和 Direct2D 示例中,他们不使用自己的 ATL,因为它是仅限桌面的库。使用 ATL 将极大地简化这些示例:用于接口指针的 CComPtr、用于窗口创建和消息处理的 CWindowImpl 等等。
Update: 这是一个更好的样本.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)