D3DCSX 11 连接和运行 FFT 功能时出现问题

问题描述 投票:0回答:1

根据标题,我在使用 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
的内部参考已损坏,但我不知道如何解决此问题。预先非常感谢您的帮助。

directx-11 directcompute
1个回答
0
投票

这里的简短答案是与 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)
© www.soinside.com 2019 - 2024. All rights reserved.