2016-08-14 1 views
0

Я пытаюсь создать Dll, который будет обрабатывать все мои рендеринга, я пытаюсь инициализировать Direct X, но я получаю следующее сообщение об ошибке:Использование DirectX внутри Dll

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 основном она находится в функции инициализации, которая находится в своем собственном классе в пределах Dll.

+0

где и когда вызывается функция инициализации класса? – Jonathan

+0

'D3D11CreateDevice' с' pAdapter = NULL' (первый параметр) вызывает внутренний вызов 'CreateDXGIFactory'. – MooseBoys

ответ

1

DllMain - особый случай, поэтому вам нужно быть осторожным в том, что вы делаете в нем. Например, он вызывается для каждого потока, который создается в вашем процессе по умолчанию. Создание COM-объектов внутри DllMain небезопасно, потому что создание COM часто связано с загрузкой других DLL, и вы получаете проблему с блокировкой загрузчика. Для получения дополнительной информации об этом см. Dynamic-Link Library Best Practices

Ваш лучший вариант здесь - иметь явный метод инициализации, который обрабатывает создание устройства Direct3D, которое вы вызываете явно из основного приложения exe.

+0

Спасибо за помощь, которую я исправил сейчас, я вызывал функцию initialize из конструктора в exe. –

Смежные вопросы