C++ DirectX11:从类成员函数初始化DirectX时发生运行时错误

C++ DirectX11:从类成员函数初始化DirectX时发生运行时错误,c++,class,pointers,runtime,directx-11,C++,Class,Pointers,Runtime,Directx 11,我设法建立了一个运行DirectX 11应用程序的工作基础。然而,在封装代码时,我注意到一些COM指针在被放置为protected:基类的成员时,并没有按照直觉预期运行 发动机中.h(收割台) 作为测试,我只运行了DirectX初始化的基本功能:交换链、视口和渲染。 (我有一个单独的[header]类用于创建窗口,它成功地显示了窗口。) 已创建类的实例 Infinity3D D3DSystem; InfinityEngine Engine(hInstance); 调用需要DirectX CO

我设法建立了一个运行DirectX 11应用程序的工作基础。然而,在封装代码时,我注意到一些COM指针在被放置为
protected:
基类的成员时,并没有按照直觉预期运行

发动机中.h(收割台)

作为测试,我只运行了DirectX初始化的基本功能:交换链、视口和渲染。 (我有一个单独的[header]类用于创建窗口,它成功地显示了窗口。)

已创建类的实例

Infinity3D D3DSystem; 
InfinityEngine Engine(hInstance);
调用需要DirectX COM对象的
D3DSystem.InitializeD3D()
或任何
Infinity3D
成员函数时,程序会产生运行时错误:

这些函数称为:

int InfinityEngine::Process(){
    while(WM_QUIT != msg.message){
    if(PeekMessage(&msg, NULL, 0,0, PM_REMOVE)){
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                            }
                            else{
                                D3DSystem.Update();
                                D3DSystem.Render();
                            }
                        }
D3DSystem.TerminateD3D();
return msg.wParam;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR lpCmdLine, int nCmdShow){
    if(Engine.DisplayWindow()){D3DSystem.InitializeD3D();Engine.Process();}
}
为了节省空间,我将仅显示初始化的3D类成员中COM指针的用法。这是在实例化
DXGI\u SWAP\u CHAIN\u DESC
并调用
D3D11CreateDeviceAndSwapChain()
之后

Swapchain->GetBuffer(0,__uuidof(ID3D11Texture2D),(LPVOID*)&Texture2d);

您的交换链是
nullptr
,这就是GetBuffer调用失败的原因。
这可能意味着您的初始化未能创建交换链

所有D3D“创建”函数都返回一个表示成功或失败的值,您应该检查这些值。
此外,您还可以打开调试层,它将在VS的输出窗口中告诉您失败的内容以及可能的原因。

您可以打开DirectX控制面板(dxcpl.exe),将程序的可执行文件名添加到列表中,然后将其设置为“强制打开”

感谢您提供的调试建议,它导致进一步评估了
D3D11CreateDeviceAndSwapChain()
失败的原因。事实证明,当我为D3D和Win32创建两个独立的非继承类时,只有Win32类存储了正确的
HWND
成员。快速修复方法是重写虚拟void StartSwapChain(ID3D11DepthStencilView*DepthStenView)接收
HWND
并用Engine.HWND填充它,直到我重写以进行继承。(做…)
Swapchain->GetBuffer(0,__uuidof(ID3D11Texture2D),(LPVOID*)&Texture2d);