3

理由は何ですか?

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;
}

GetDesktopWindow()は単純化のために使用されています。独自のウィンドウを作成して使用しようとしましたが、同じ結果になりました。

4

1 に答える 1

5

でこのようなことをすることはできませんDllMain。具体的には、他のDLLから関数を呼び出すことはできません。これは、メインアプリケーションによって呼び出されたときに、エクスポートされた関数からのみ実行できます。

MSDNのドキュメントを引用する:

DllMainのスレッドはローダーロックを保持しているため、追加のDLLを動的にロードまたは初期化することはできません。

Kernel32.dll以外のDLLを必要とする関数を呼び出すと、診断が難しい問題が発生する可能性があります。たとえば、User、Shell、およびCOM関数を呼​​び出すと、一部の関数が他のシステムコンポーネントをロードするため、アクセス違反エラーが発生する可能性があります。

于 2010-11-18T23:25:28.117 に答える