D3D10CreateDeviceAndSwapChain() 总是以 DXGI_ERROR_INVALID_CALL 失败

Posted

技术标签:

【中文标题】D3D10CreateDeviceAndSwapChain() 总是以 DXGI_ERROR_INVALID_CALL 失败【英文标题】:D3D10CreateDeviceAndSwapChain() always failing with DXGI_ERROR_INVALID_CALL 【发布时间】:2012-01-31 14:10:54 【问题描述】:

我正在创建一个隐藏窗口,并希望获得指向IDXGISwapChain::Present() 的指针。问题是我无法获得有效的 Direct3D10 设备,也无法获得有效的交换链。

HWND hwnd = CreateWindow(TEXT("flhiSTATIC"), TEXT("flh DXGI Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, 0, NULL, NULL, 0);
DXGI_SWAP_CHAIN_DESC scd;
ZeroMemory(&scd, sizeof(scd));

scd.BufferCount = 2;
RECT rcWnd;
GetClientRect(hwnd, &rcWnd);

scd.BufferDesc.Width = rcWnd.right - rcWnd.left;
scd.BufferDesc.Height = rcWnd.bottom - rcWnd.top;
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // also tried DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
scd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
scd.BufferDesc.Scaling = DXGI_MODE_SCALING_CENTERED;
scd.BufferDesc.RefreshRate.Numerator = 60;
scd.BufferDesc.RefreshRate.Denominator = 1;
scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
scd.OutputWindow = hwnd;
scd.SampleDesc.Count = 1;
scd.SampleDesc.Quality = 0;
scd.Windowed = TRUE;
scd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;

pD3D10CreateDeviceAndSwapChain = reinterpret_cast<D3D10CREATEDEVICEANDSWAPCHAIN_PROC *>(GetProcAddress(d3d10, "D3D10CreateDeviceAndSwapChain"));

HRESULT hr = pD3D10CreateDeviceAndSwapChain(NULL /*pAdapter*/, D3D10_DRIVER_TYPE_HARDWARE, NULL, D3D10_CREATE_DEVICE_DEBUG, D3D10_SDK_VERSION, &scd, &pSwapChain, &pDev);
// this guy always fails with 0 in both pSwapChain and pDev...

知道上面的代码有什么问题吗?

【问题讨论】:

我认为问题是我未能注册一个窗口类。我目前正在调查这个问题。 您应该验证CreateWindow 返回一个非零值。 【参考方案1】:

我完全忘记了创建或分配预先存在的窗口类的需要:(

这就是问题所在;经验教训 - 始终检查所有调用的返回码。

编辑

我完全忘记使用有效窗口类调用CreateWindow,要么是我之前注册的,要么是某人在当前模块中注册的。

【讨论】:

你如何“分配一个预先存在的窗口类”?你能不能让你的答案更清楚? @samhocevar - 我没有粘贴窗口类flhiSTATIC注册的地方不是因为简洁,而是因为我从来没有注册过这样的窗口类;所以CreateWindow 调用失败。它应该接收一个有效的类才能成功,要么是我自己创建的,要么是我通过不同方式从代码的其他部分“钓鱼”的一个(我粘贴的这段代码实际上是注入到另一个进程中的)。

以上是关于D3D10CreateDeviceAndSwapChain() 总是以 DXGI_ERROR_INVALID_CALL 失败的主要内容,如果未能解决你的问题,请参考以下文章

在 D3D11 中将纹理预加载到 GPU 内存

(转)D3D11游戏编程学习笔记二:XNAMath之XMVECTOR

D3D11:如何将 GDI 文本绘制到 GXDI 表面? (没有 D2D)

DirectX11 执行警告 #355

《OpenCL编程指南》之 与Direct3D互操作

关于电上店下