Directx 从DllMain调用IDirect3D9::CreateDevice()将挂起
原因是什么 从DLL_PROCESS_ATTACH上的DllMain()调用IDirect3D9::CreateDevice(),它将挂起 代码很简单,就像:Directx 从DllMain调用IDirect3D9::CreateDevice()将挂起,directx,direct3d,direct3d9,Directx,Direct3d,Direct3d9,原因是什么 从DLL_PROCESS_ATTACH上的DllMain()调用IDirect3D9::CreateDevice(),它将挂起 代码很简单,就像: BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { if (ul_rea
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调用函数。只有在主应用程序调用导出函数时,才能从导出函数执行此操作
引述:
DllMain中的线程持有加载程序锁,因此无法动态加载或初始化其他DLL
调用需要Kernel32.dll以外的dll的函数可能会导致难以诊断的问题。例如,调用User、Shell和COM函数可能会导致访问冲突错误,因为某些函数会加载其他系统组件
是的,这是真的,通过生成另一个线程并在那里做我需要的一切来解决这个问题(不要在DllMain中等待,因为这也会挂断)@Andrew:那么接受他的答案吧!:)