如何在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
相关产品推荐
相关产品推荐

