代码之家  ›  专栏  ›  技术社区  ›  Andriy Tylychko

从DllMain挂起调用IDirect3D9::CreateDevice()

  •  3
  • Andriy Tylychko  · 技术社区  · 15 年前

    什么是原因?

    从DLL进程附件上的DllMain()调用IDirect3D9::CreateDevice(),它挂起

    代码很简单,就像:

    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()用于简单起见,我尝试创建自己的窗口并使用它,结果相同

    1 回复  |  直到 15 年前
        1
  •  5
  •   casablanca    15 年前

    你不能在里面做这种事 DllMain . 特别是,不能从其他dll调用函数。只有在主应用程序调用导出函数时,才能从该函数执行此操作。

    引用 the docs on MSDN :

    DllMain中的线程持有加载程序锁,因此不能动态加载或初始化其他dll。

    调用需要Kernel32.dll以外的dll的函数可能会导致难以诊断的问题。例如,调用User、Shell和COM函数可能会导致访问冲突错误,因为某些函数会加载其他系统组件。

    推荐文章