首页 > 解决方案 > DirectX9 CreateDevice 在 C 中失败,但在 C++ 中成功

问题描述

我在 C 中制作了一个 d3d9 应用程序,但是当尝试创建一个设备对象时,它在 C 中失败了,但它在 C++ 中的对应物正常工作并返回 S_OK。
C:

isOk = pD3D->lpVtbl->CreateDevice(pD3D, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3dpParams.hDeviceWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpParams, &lpDevice);

C++:

isOk = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3dpParams.hDeviceWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpParams, &lpDevice);

我的猜测在于 D3DPRESENT_PARAMETERS d3dpParams 在 C++ 中它是用“= {}”初始化的:

D3DPRESENT_PARAMETERS d3dpParams = {};
d3dpParams.Windowed = false;
d3dpParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
...

而在 C 中你只能写“;”:

D3DPRESENT_PARAMETERS d3dpParams;
d3dpParams.Windowed = false;
d3dpParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
...

*pD3D 是由 Direct3DCreate9() 创建的 IDirect3D9*,如果我理解正确,它不会失败。

它最初是用 gcc 完成的,但 msvc 给出了完全相同的结果。

标签: c++cdirectx

解决方案


普通 C 结构的={}初始化仅将内存归零。

微软自己的示例在https://docs.microsoft.com/en-us/windows/win32/direct3d9/creating-a-device建议ZeroMemory这样做:

D3DPRESENT_PARAMETERS d3dpp; 

ZeroMemory( &d3dpp, sizeof(d3dpp) );

推荐阅读