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

如何在C语言中从IDXGIFactory调用EnumAdapters函数

解决方法

1. 修正C语言COM接口方法的调用逻辑

在C语言中,COM接口的方法不能直接通过pFactory->EnumAdapters的形式访问——IDXGIFactory结构体的核心成员是指向虚函数表的lpVtbl指针,所有接口方法都定义在这个虚表里。正确的调用方式需要通过虚表访问,并将接口自身指针作为第一个参数传入:

if (pFactory != NULL) {
    HRESULT hr = pFactory->lpVtbl->EnumAdapters(pFactory, i, &pAdapter);
    if (SUCCEEDED(hr)) {
        // 适配器获取成功,执行后续逻辑
        pAdapter->lpVtbl->Release(pAdapter); // 使用完记得释放资源
    } else {
        printf("枚举适配器失败: 0x%X\n", hr);
    }
    pFactory->lpVtbl->Release(pFactory); // 释放Factory对象
}

2. 修复参数传递错误

原代码中调用EnumAdapters时,第二个参数传入的是pAdapter,但该方法需要指针的指针(IDXGIAdapter**类型)来输出创建的适配器对象,因此必须传入&pAdapter。

3. 额外注意事项

  • 确保编译时包含正确的头文件:#include <dxgi.h>,并链接DXGI库(如dxgi.lib)。
  • 所有COM对象使用完毕后必须调用Release方法释放,避免内存泄漏。
  • 若你的环境支持DXGI 1.1及以上版本,推荐使用IDXGIFactory1接口(功能更丰富),创建方式调整为:
    IDXGIFactory1* pFactory1 = NULL;
    HRESULT hr = CreateDXGIFactory1(&IID_IDXGIFactory1, (void**)&pFactory1);
    
    其方法调用逻辑与IDXGIFactory一致,仅虚表方法顺序不同,头文件会自动处理定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:31:00