2010-11-18 89 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