вызов IDirect3D9 :: CreateDevice () из DllMain зависает - PullRequest
3 голосов
/ 19 ноября 2010

В чем может быть причина?

Из DllMain () на DLL_PROCESS_ATTACH я звоню 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 Ответ

5 голосов
/ 19 ноября 2010

Вы не можете делать такие вещи в DllMain.В частности, вы не можете вызывать функции из других DLL.Это можно сделать только из экспортированной функции, когда она вызывается основным приложением.

Цитирование документов в MSDN :

Потоки в DllMain удерживаютсяблокировка загрузчика, поэтому никакие дополнительные библиотеки DLL не могут быть динамически загружены или инициализированы.

Вызов функций, которым требуются библиотеки DLL, отличные от Kernel32.dll, может привести к проблемам, которые трудно диагностировать.Например, вызов функций User, Shell и COM может вызвать ошибки нарушения доступа, поскольку некоторые функции загружают другие компоненты системы.

...