【发布时间】: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