根据标题,我在使用 D3DCSX 11 设置和运行基于 DirectX11 GPU 的 FFT 时遇到问题 (系统:Win10 Pro + MS Visual Studio Community 2022(版本:17.8.3)、Windows kit 10(版本:10.0.22621.0))
我的包含文件和链接文件:
#include <d3dcsx.h>
#pragma comment(lib, "d3dcsx.lib")
根据 MS 参考指南,这应该足够了。但是,如果我启动应用程序并调用
D3DX11CreateFFT(..)
,我会收到一个错误窗口,指出无法找到 d3dcsx.dll
。我通过将 d3dcsx_47.dll
从套件 10 bin
目录复制到我的可执行目录并将其重命名为 d3dcsx.dll
来解决问题。虽然错误消息消失了,但现在无论我提供什么参数,我在调用 D3DX11CreateFFT(..)
等函数时都会收到 E_OUTOFMEMORY 错误。
我猜 Windows Kit 10 安装有问题,但它是全新安装在新系统上的。似乎从
d3dcsx.lib
到实际 d3dcsx_47.dll
的内部参考已损坏,但我不知道如何解决此问题。预先非常感谢您的帮助。
这里的简短答案是与 D3DXCS.LIB / D3DCSX_47.DLL 的隐式链接已损坏。导入库未引用正确的 DLL 名称。虽然为本地部署重命名 DLL 有效,但这意味着它无法在 Microsoft 符号服务器上找到 PDB 文件。
因此,如果您要使用 D3DXCS11,您应该真的 使用显式链接。
auto hmod = LoadLibraryW(D3DCSX_DLL_W);
if (!hmod)
return 1;
using PFN_D3DX11CreateFFT2DReal = HRESULT (WINAPI *)(
ID3D11DeviceContext * pDeviceContext,
UINT X,
UINT Y,
UINT Flags,
_Out_ D3DX11_FFT_BUFFER_INFO * pBufferInfo,
_Out_ ID3DX11FFT * *ppFFT
);
auto createFFT2DReal = reinterpret_cast<PFN_D3DX11CreateFFT2DReal>(static_cast<void*>(GetProcAddress(hmod, "D3DX11CreateFFT2DReal")));
if (!createFFT2DReal)
return 1;
D3DX11_FFT_BUFFER_INFO fftbufferinfo = {};
CComPtr<ID3DX11FFT> pFFT = 0;
HRESULT hr = createFFT2DReal(pContext, 16, 16, 0, &fftbufferinfo, &pFFT);
if (FAILED(hr))
return 1;
并且您需要将DLL文件复制到本地构建目录:
copy "C:\Program Files (x86)\Windows Kits\10\Redist\D3D\x64\d3dcsx_47.dll" $(OutDir)