NvAPI_GPU_GetAllDisplayIds调用失败,返回NVAPI_INCOMPATIBLE_STRUCT_VERSION
解决NVAPI调用NvAPI_GPU_GetAllDisplayIds返回NVAPI_INCOMPATIBLE_STRUCT_VERSION的问题
嘿,这个问题我之前也碰到过!完全不是malloc的问题,核心原因是你创建的NV_GPU_DISPLAYIDS结构体没有设置正确的版本号。NVAPI的大部分结构体都要求先初始化version字段,告诉API你使用的结构体版本,否则就会返回NVAPI_INCOMPATIBLE_STRUCT_VERSION(-9)这个错误码。
具体怎么修复?
在你用malloc分配完内存之后,需要遍历每个NV_GPU_DISPLAYIDS实例,把它们的version字段设置为NV_GPU_DISPLAYIDS_VER——这个宏是NVAPI头文件里定义的对应版本常量,API就是靠它识别你用的结构体版本的。
修改后的代码片段如下:
NV_GPU_DISPLAYIDS* displayIds = static_cast<NV_GPU_DISPLAYIDS*>(malloc(sizeof(NV_GPU_DISPLAYIDS) * displayIdCount)); // 必须初始化每个结构体的version字段 for (unsigned j = 0; j < displayIdCount; ++j) { displayIds[j].version = NV_GPU_DISPLAYIDS_VER; } status = NvAPI_GPU_GetAllDisplayIds(hPhysicalGpu, displayIds, &displayIdCount); if (NVAPI_OK != status) { cerr << "Failed to run function: NvAPI_GPU_GetAllDisplayIds\nStatus: " << status << endl; free(displayIds); // 别忘了释放内存,避免泄漏 return 1; } // 这里可以添加对displayIds的处理逻辑 // ... free(displayIds); // 使用完毕后记得释放内存
额外提醒:
- NVAPI的设计逻辑就是靠结构体版本号来做向后兼容的,所以几乎所有需要传入API的结构体,都得先设置对应的
version常量,不然很容易踩这种版本不兼容的坑。 - 你原来的代码里malloc之后没释放内存,记得加上
free,避免内存泄漏哦。
内容的提问来源于stack exchange,提问作者Ari Seyhun
相关产品推荐
相关产品推荐

