【问题标题】:Using DirectX within a Dll在 Dll 中使用 DirectX
【发布时间】:2016-08-14 14:50:34
【问题描述】:

我正在尝试创建一个将处理我的所有渲染的 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 main 中,它在一个初始化函数中,该函数在 Dll 中它自己的类中。

【问题讨论】:

  • 类初始化函数在何时何地被调用?
  • D3D11CreateDevicepAdapter=NULL(第一个参数)导致对 CreateDXGIFactory 的内部调用。

标签: c++ dll directx


【解决方案1】:

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

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

【讨论】:

  • 感谢您的帮助,我现在已修复它,我正在从 exe 中的构造函数调用初始化函数。
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多