2010-11-18 4 views
3

Что может быть причиной?вызов IDirect3D9 :: CreateDevice() из DllMain зависает

Из DllMain() на DLL_PROCESS_ATTACH Я звоню IDirect3D9 :: CreateDevice() и он висит

код прост, так же, как:

BOOL APIENTRY DllMain(HMODULE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 
    if (ul_reason_for_call = DLL_PROCESS_ATTACH) { 
     IDirect3D9* d3d = Direct3DCreate9(D3D_SDK_VERSION); 

     D3DPRESENT_PARAMETERS pp = {}; 
     pp.BackBufferWidth = 1; 
     pp.BackBufferHeight = 1; 
     pp.BackBufferFormat = D3DFMT_X8R8G8B8; 
     pp.BackBufferCount = 1; 
     pp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
     pp.Windowed = TRUE; 

     IDirect3DDevice9* device = NULL; 
     HRESULT hr = d3d->CreateDevice(
      D3DADAPTER_DEFAULT, 
      D3DDEVTYPE_HAL, 
      GetDesktopWindow(), 
      D3DCREATE_HARDWARE_VERTEXPROCESSING, 
      &pp, 
      &device); 

     device->Release(); 
     d3d->Release(); 
    } 
    return TRUE; 
} 

GetDesktopWindow() используется для простоты, я попытался создать собственное окно и использовать его, тот же результат

ответ

5

Вы не можете делать такие вещи в DllMain. В частности, вы не можете вызывать функции из других DLL. Это можно сделать только из экспортируемой функции, когда она вызывается основным приложением.

Цитирование the docs on MSDN:

Темы DllMain удерживать блокировку загрузчика, так что никаких дополнительных библиотек DLL не может быть динамически загружен или инициализирована.

Функции вызова, требующие DLL, отличные от Kernel32.dll, могут привести к проблемам, которые трудно диагностировать. Например, вызов функций User, Shell и COM может вызвать ошибки в доступе, поскольку некоторые функции загружают другие компоненты системы.

+1

да, это правда, решить этот порождая другой поток и делать все, что нужно там (не дожидаясь его в DllMain потому это будет висеть слишком) –

+0

@ Андрей: Примите его ответ тогда! :) – Goz

+0

сделано, извините за задержку :) –