2010-11-18 9 views
3

Was kann ein Grund sein?Aufruf IDirect3D9 :: CreateDevice() von DllMain hängt

Von DllMain() auf DLL_PROCESS_ATTACH I IDirect3D9 :: Create bin() aufrufen und es hängt

Code einfach ist, genau wie:

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() der Einfachheit halber verwendet wird, I versucht, ein eigenes Fenster zu erstellen und es zu verwenden, das gleiche Ergebnis

Antwort

5

Sie können diese Art von Dingen in DllMain nicht tun. Insbesondere können Sie Funktionen von anderen DLLs nicht aufrufen. Sie können dies nur von einer exportierten Funktion tun, wenn sie von der Hauptanwendung aufgerufen wird.

Zitiert the docs on MSDN:

Threads in DllMain das Schloss loader halten, so dass keine zusätzlichen DLLs dynamisch geladen oder initialisiert werden kann.

Das Aufrufen von Funktionen, die andere DLLs als Kernel32.dll erfordern, kann zu Problemen führen, die schwer zu diagnostizieren sind. Beispielsweise kann das Aufrufen von Benutzer-, Shell- und COM-Funktionen Zugriffsverletzungsfehler verursachen, da einige Funktionen andere Systemkomponenten laden.

+1

yep, es ist wahr, aufgelöst dies einen weiteren Faden durch das Laichen und alles zu tun, ich es brauchen (nicht cos dies für sie in DllMain wartet aufhängen zu) –

+0

@ Andrew: Nehmen Sie seine Antwort dann! :) – Goz

+0

erledigt, Entschuldigung für Verspätung :) –