gpt4 book ai didi

c++ - Direct2D : Unhandled Exception In WM_RESIZE switch case

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:02 24 4
gpt4 key购买 nike

我正在创建一个 Simple Direct2D Application .不幸的是它给未处理的异常。发生的函数:

    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*/
}

异常(exception)说:Simple Direct2D application.exe 中 0x00007FF6BE402CCA 处的未处理异常:0xC000041D:在用户回调期间遇到未处理的异常。发生了

异常截图:

the pic of exception

我一开始调试程序,它就给出了异常。我什至从网站上逐字复制程序。由于我是 DirectX 世界的新手,我对异常一无所知。我该怎么办?

最佳答案

我已经编译了那个样本。它在 32 位构建中工作,在 64 位构建中崩溃。

错误在微软的示例代码中,与Direct2D无关。

它们将 this 传递给 SetWindowLongPtr,并结合 PtrToUlong 宏进行类型转换。在 64 位构建中,this 是 8 字节长,SetWindowLongPtr 也接受 8 字节,但是 PtrToUlong 宏转换为 unsigned long 只有 4 个字节。所以 PtrToUlong 宏从 this 指针中删除高 4 个字节,应用程序失败了。

您可以通过将 PtrToUlong( pDemoApp ) 替换为 (LONG_PTR)pDemoApp 来修复

附言我认为根本原因是,MS 非常努力地假装 Win32 平台已经过时,而是将开发人员推向 UWP。这就是为什么在他们的 DirectX 和 Direct2D 示例中,他们不使用他们自己的 ATL,因为它是仅限桌面的库。使用 ATL 将极大地简化这些示例:用于接口(interface)指针的 CComPtr、用于窗口创建和消息处理的 CWindowImpl,等等。

更新:here's a better sample .

关于c++ - Direct2D : Unhandled Exception In WM_RESIZE switch case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45823455/

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