【问题标题】:D3D11CreateDeviceAndSwapChain fails with 887a0001D3D11CreateDeviceAndSwapChain 失败并显示 887a0001
【发布时间】:2021-08-28 11:11:18
【问题描述】:

当我尝试创建设备并且交换链 D3D11CreateDeviceAndSwapChain 失败并显示 887a0001。我正在尝试从我的 dll 中调用它。

DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory(&sd, sizeof(sd));

sd.BufferCount = 2;
sd.BufferDesc.Width = 0;
sd.BufferDesc.Height = 0;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = FALSE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;

UINT createDeviceFlags = 0;
D3D_FEATURE_LEVEL featureLevel;
const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, };

HRESULT res = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &swapchain, &device, &featureLevel, &devicecontext);
if (res != S_OK) {
   printf("failed to create device and swap %llx\n", res);
   return false;
}

我已经看到通过不同的线程解决了一些问题,但我没有任何运气这样做。

__int32 __stdcall DllMain(void* baseaddress)
{
    Start();
    return 1;
}

函数 start 是我创建窗口的地方,尝试创建我的设备并线程化消息调度程序

【问题讨论】:

  • 按照微软的文档,这是无效参数数据的错误代码。您的错误很有可能是由您设置的任何错误引起的,请检查您的 HWND 变量是否不是 nullptr,还要检查您的交换链描述是否与您的窗口匹配,一些值(例如 Width 和 Height 设置为 0)是有点奇怪,尝试在交换链描述中将 BufferCount 设置为 1,并尝试使用 NULL 宏代替您自己定义的功能级别参数。
  • 感谢您的回复,我检查了窗口句柄指针,它不为空。对于设置的宽度和高度为 0 DXGI_MODE_DESC docs(当设置为 0 时,它将自动设置尺寸)无论如何我都会提醒它窗口的宽度和高度,结果相同。更改缓冲区计数也没有效果。
  • 很奇怪的问题,我建议您尝试设置createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG 以查看是否在控制台上抛出任何带有更多信息的消息,我不确定这是否是由于将项目编译为 DLL,因此我还建议您尝试转到项目设置并将 TargetExtension 更改为 .exe 并查看它是否构建了可执行文件。
  • 是的,我将图像编译为可执行文件,并且它运行良好(在恢复到我的旧交换链描述后)。我切换回一个 dll,它仍然抛出同样的错误。在使用调试标志创建设备时,我也没有得到任何额外的调试信息。
  • 好吧,这让我没有主意了。我真的认为您的问题与您的代码有关,而不是您将其编译为 dll,我什至在这里将自己的 direct3d 引擎编译为 dll 以查看是否出现相同的问题,但它工作正常.因此,我对导致您问题的最后一个赌注是您的程序入口点,尝试从您的项目中删除具有您的入口点的文件,然后按CTRL+B 以查看相同的错误是否继续存在,如果确实如此,那么我抱歉,我已经不知道还能做什么了,你唯一的选择可能是使用静态库。

标签: c++ directx-11 direct3d


【解决方案1】:

如果你调试你的程序,你应该在输出中看到这个:

DXGI ERROR: CreateDXGIFactory cannot be called from DllMain. [ MISCELLANEOUS ERROR #76: ]

这是预期的,如下所述:DXGI responses from DLLMain(D3D11CreateDeviceAndSwapChain 将隐式创建 DXGI 工厂)

如果您的应用程序的 DllMain 函数创建了 DXGI 工厂,则 DXGI 会返回一个 错误代码。

所以,你不能从DllMain 打电话(这是一个非常特别的地方,有些black magic voodoo happens。)

【讨论】:

  • 感谢您的回复,我已经阅读了您所说的更多内容,显然即使 createthread 也可能存在风险。我还应该如何调用我的 start 函数而不在进程中挂接某些东西来为我调用它?
猜你喜欢
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 2021-12-10
  • 2020-02-08
  • 2011-05-21
  • 2012-05-04
  • 2019-07-21
  • 1970-01-01
相关资源
最近更新 更多