You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++模块中调用DirectX 12函数返回E_NOINTERFACE的问题求助

C++模块中调用CreateDXGIFactory2返回E_NOINTERFACE的解决方案

问题描述

在DirectX 12图形引擎中使用C模块时,调用CreateDXGIFactory2返回E_NOINTERFACE错误。程序可正常编译,但运行时断言失败,调试确认HRESULT值为E_NOINTERFACE,推测是C模块的“首次使用时导入”特性导致链接器未正确加载DXGI库的符号。

最简复现代码如下:

Factory.ixx

module;
#include <dxgi1_6.h>
#include <wrl.h>
#include <cassert>
#pragma comment(lib, "dxgi")

export module Factory;

using namespace Microsoft::WRL;

export class Factory
{
    ComPtr<IDXGIFactory7> pFactory {};

public:
    Factory() noexcept
    {
        HRESULT HResult { S_OK };
        HResult = CreateDXGIFactory2( DXGI_CREATE_FACTORY_DEBUG, IID_PPV_ARGS( &pFactory ) );
        assert( HResult == S_OK );
    }
};

Main.cpp

#include <cstdint>
#include <d3d12.h>
#include <dxgi1_6.h>
import Factory;

uint32_t main( void )
{
    Factory factory {};
    return 0;
}

已尝试的无效方案:

  • 模块定义文件(.def):添加导出规则后触发LNK1120链接错误
  • 手动添加虚拟调用:虽有效但繁琐,需逐个处理用到的函数
  • /WHOLEARCHIVE:dxgi.lib链接选项:仍返回E_NOINTERFACE,且引发符号重复问题
  • 用import替代#include:仅适用于模块,对系统库无效
  • 显式添加dxgi.lib依赖:Windows SDK库已默认链接,无效果
  • 切换IDXGIFactory接口版本:高低版本均无法解决问题

解决方案

针对C++模块的延迟导入特性,提供两种便捷解决方法:

方法1:模块内显式引用函数符号

在模块单元中添加全局变量,引用CreateDXGIFactory2的地址,强制链接器导入该符号。修改后的Factory.ixx如下:

module;
#include <dxgi1_6.h>
#include <wrl.h>
#include <cassert>
#pragma comment(lib, "dxgi")

export module Factory;

using namespace Microsoft::WRL;

// 强制链接器导入CreateDXGIFactory2符号
extern "C" HRESULT __stdcall CreateDXGIFactory2(UINT, const IID&, void**);
static auto _forceImport = &CreateDXGIFactory2;

export class Factory
{
    ComPtr<IDXGIFactory7> pFactory {};

public:
    Factory() noexcept
    {
        HRESULT HResult { S_OK };
        HResult = CreateDXGIFactory2( DXGI_CREATE_FACTORY_DEBUG, IID_PPV_ARGS( &pFactory ) );
        assert( HResult == S_OK );
    }
};

方法2:链接器/INCLUDE选项配置

直接通过链接器强制导入指定符号,无需修改代码:

  1. 打开项目属性 → 链接器 → 命令行
  2. 在“附加选项”中输入 /INCLUDE:CreateDXGIFactory2

原理说明

C++模块的“首次使用时导入”机制会让链接器仅导入模块中直接显式使用的符号,但CreateDXGIFactory2是通过IID_PPV_ARGS宏间接调用的,链接器无法识别这种间接依赖,导致符号未被导入。上述两种方法均强制链接器加载该符号,确保DXGI库的接口能被正确初始化。

内容的提问来源于stack exchange,提问作者Giogification

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:34:56