2010-11-18 7 views
3

Qu'est-ce qu'une raison?appelant IDirect3D9 :: CreateDevice() à partir de DllMain se bloque

De DllMain() sur DLL_PROCESS_ATTACH J'appelle IDirect3D9 :: CreateDevice() et il se bloque

Code

est simple, comme:

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() est utilisé pour la simplicité, je essayé de créer sa propre fenêtre et l'utiliser, le même résultat

Répondre

5

Vous ne pouvez pas faire ce genre de choses dans DllMain. Plus précisément, vous ne pouvez pas appeler les fonctions d'autres DLL. Vous ne pouvez le faire à partir d'une fonction exportée, quand il est appelé par l'application principale.

mentionnant the docs on MSDN:

Discussions dans DllMain maintenir le verrou de chargeur de sorte qu'aucune DLL supplémentaires peuvent être chargées ou initialisées de manière dynamique.

L'appel de fonctions nécessitant des DLL autres que Kernel32.dll peut entraîner des problèmes difficiles à diagnostiquer. Par exemple, appeler des fonctions utilisateur, Shell et COM peut entraîner des erreurs de violation d'accès, car certaines fonctions chargent d'autres composants système.

+1

Eh oui, il est vrai, résolu cela en fraie un autre fil et de faire tout ce que je besoin là-bas (sans attendre dans DllMain cos ce raccroche aussi) –

+0

@ Andrew: Accepter sa réponse alors! :) – Goz

+0

fait, désolé pour le retard :) –