2010-11-18 3 views
3

이유가 무엇입니까?DllMain에서 IDirect3D9 :: CreateDevice()를 호출하면 응답이 없습니다.

내가 IDirect3D9 :: CreateDevice를을 (전화 드렸습니다 DLL_PROCESS_ATTACH에 DllMain()에서

)하고

코드는 간단하다 중단, 단지 좋아 :

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을 동적으로로드하거나 초기화 할 수 있습니다를 누르고 있습니다.

Kernel32.dll 이외의 DLL이 필요한 함수를 호출하면 진단하기 어려운 문제가 발생할 수 있습니다. 예를 들어, 일부 함수는 다른 시스템 구성 요소를로드하기 때문에 User, Shell 및 COM 함수를 호출하면 액세스 위반 오류가 발생할 수 있습니다.

+1

네, 그것은 사실, 다른 스레드를 산란하고 내가 거기에 필요한 모든 기능을 수행하여이 문제를 해결 –

+0

앤드류 (이 왜냐하면 DllMain에서 기다리고하지 너무 끊고됩니다) : 그의 대답을 수락! :) – Goz

+0

완료, 미안 지연 : –

관련 문제