2010-11-18 87 views
3

可能是什麼原因?從DllMain調用IDirect3D9 :: CreateDevice()掛起

從上DLL_PROCESS_ATTACH我打電話IDirect3D9 :: CreateDevice的(的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

是的,這是真的,由產卵另一個線程做的一切,我需要有解決這個(沒有DllMain的等待它COS這將掛斷太) – 2010-11-20 14:41:21

+0

@Andrew:接受他的答案呢! :) – Goz 2010-11-21 12:41:03

+0

完成,抱歉延誤:) – 2010-12-13 15:11:53