Вызов IDIRECT3D9 :: Createvice () от Dllmain зависает
Вопрос
Что может быть причиной?
От dllmain () на dll_process_attch я звоню iDirect3d9 :: Createvice () и это зависает
код простой, как:
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 () используется для простоты, я пытался создать собственное окно и использовать его, тот же результат
Решение
Вы не можете сделать такие вещи в DllMain
. Отказ В частности, вы не можете вызывать функции из других DLL. Вы можете сделать это только из экспортированной функции, когда она называется основным приложением.
Цитирование Документы на MSDN:
Темы в DLLMain Удерживают блокировку погрузчика, поэтому никакие дополнительные DLL не могут быть динамически загружены или инициализированы.
Вызов функций, требующих DLL, кроме Kernel32.dll, может привести к проблемам, которые трудно диагностируют. Например, вызывая пользователь, оболочка и функции COM могут вызывать ошибки нарушения доступа, поскольку некоторые функции загружают другие компоненты системы.