c++ - 在 Dll 中使用 DirectX

标签 c++ dll directx

我正在尝试创建一个 Dll 来处理我所有的渲染,我正在尝试初始化 Direct X,但我收到以下错误消息:

DXGI ERROR: CreateDXGIFactory cannot be called from DllMain. [ MISCELLANEOUS ERROR #76: ] Exception thrown at 0x00007FF978181F28 in Engine.exe: Microsoft C++ exception: _com_error at memory location 0x000000541631BE90.

我从来没有直接调用CreateDXGIFactory,我只在程序崩溃前调用了D3D11CreateDevice,下面是D3D11CreateDevice的代码:

HRESULT hRes;
    D3D_FEATURE_LEVEL featureLevel;
    m_pConsole->WriteToConsole("Creating D3D11 device !");
    hRes = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, NULL, 0, D3D11_SDK_VERSION, &m_pD3D11Device, &featureLevel, &m_pD3D11DeviceContext);

这个函数调用不在 Dll main 中,而是在 Dll 中它自己的类中的初始化函数中。

最佳答案

DllMain 是一个特例,因此您必须小心处理其中的操作。例如,默认情况下,它会为进程中创建的每个线程 调用。在 DllMain 中创建 COM 对象并不安全,因为 COM 创建通常涉及加载其他 DLL,最终会遇到“加载程序锁定”问题。有关这方面的更多信息,请参阅 Dynamic-Link Library Best Practices

你最好的选择是有一个显式初始化方法来处理创建你从你的主应用程序 exe 显式调用的 Direct3D 设备。

关于c++ - 在 Dll 中使用 DirectX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38943370/

相关文章:

dll - VC2019不能使用CString参数(VC6.0内置)

c# - Xamarin 的绑定(bind)库生成没有类信息的 DLL

directx/HLSL 什么是输入和输出语义?

c++ - 为什么一般程序一般都是从0x8000开始?

c++ - 我如何使用可变参数模板产生默认参数的效果

python - 将 .lib 和 .h 文件转换为可在 Python 中使用的 DLL

delphi - 更改 DrawTextLayout 的 DWriteMeasuringMode

c++ - 如何有效地计算整个像素着色器阶段使用颜色的次数?

c++ - 从 SinkWriter 或 ICodecAPI 或 IMFTransform 获取编码器名称

c++ - 为什么 `expected primary-expression` 看起来没问题