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

And*_*hko 3 directx direct3d direct3d9

可能是什么原因?

来自DLL_PROCESS_ATTACH上的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;
}
Run Code Online (Sandbox Code Playgroud)

GetDesktopWindow()用于简单,我试图创建自己的窗口并使用它,结果相同

cas*_*nca 5

你不能做这些事情DllMain.具体来说,您无法从其他DLL调用函数.只有当主应用程序调用导出的函数时,才能执行此操作.

在MSDN上引用文档:

DllMain中的线程保持加载程序锁定,因此不能动态加载或初始化其他DLL.

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