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


  DXGI错误:无法从DllMain调用CreateDXGIFactory。 [其他错误#76:]
  在Engine.exe中的0x00007FF978181F28处引发异常:Microsoft C ++异常:内存位置0x000000541631BE90处的_com_error。


我从不直接调用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主程序中,而是在Dll中自己类中的初始化函数中。

最佳答案

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

这里最好的选择是拥有一个显式的初始化方法,该方法可处理创建从主应用程序exe中显式调用的Direct3D设备。

09-06 06:05