来自WMI的nVidia驱动版本不是我想要的

nVidia driver version from WMI is not what I want

本文关键字:版本 我想要 WMI nVidia 来自      更新时间:2023-10-16

我想获得nVidia显卡的驱动程序版本。所以我使用WMI并从"Win32_VideoController"类的"DriverVersion"对象中获取数据。但它是"9.18.13.1106"(文件版本),我想要的是"311.06"(文件版本)。我从哪里可以得到这些信息?如果在WMI上是不可能的,我想知道其他的方法。谢谢。

您可以使用nVidia的Tesla部署工具包中的NVML来完成此操作。您可以使用如下代码检索内部驱动程序版本(您习惯看到的nVidia驱动程序版本):

#include <iostream>
#include <string>
#include <stdlib.h>
#include <nvml.h>
#include <windows.h>
namespace { 
typedef nvmlReturn_t (*init)();
typedef nvmlReturn_t (*shutdown)();
typedef nvmlReturn_t (*get_version)(char *, unsigned);
class NVML {
    init nvmlInit;
    shutdown nvmlShutdown;
    get_version nvmlGetDriverVersion;
    std::string find_dll() {
        std::string loc(getenv("ProgramW6432"));
        loc += "\Nvidia Corporation\nvsmi\nvml.dll";
        return loc;
    }
public:    
    NVML() {
        HMODULE lib = LoadLibrary(find_dll().c_str());
        nvmlInit = (init)GetProcAddress(lib, "nvmlInit");
        nvmlShutdown = (shutdown)GetProcAddress(lib, "nvmlShutdown");
        nvmlGetDriverVersion = (get_version)GetProcAddress(lib, "nvmlSystemGetDriverVersion");
        if (NVML_SUCCESS != nvmlInit())
            throw(std::runtime_error("Unable to initialize NVML"));
    }
    std::string get_ver() {
        char buffer[81];
        nvmlGetDriverVersion(buffer, sizeof(buffer));
        return std::string(buffer);
    }
    ~NVML() {
        if (NVML_SUCCESS != nvmlShutdown())
            throw(std::runtime_error("Unable to shut down NVML"));
    }
};
}
int main() {  
    std::cout << "nVidia Driver version: " << NVML().get_ver();
}

请注意,如果您在一台可以自由编辑PATH的机器上编写这段代码纯粹是为了自己使用,那么您可以将其简化很多。大多数代码处理的事实是,这使用NVML.DLL,它在一个目录中,通常不在路径上,所以代码动态加载,并使用GetProcAddress找到我们需要使用的函数。在本例中,我们只使用了三个函数,所以处理起来并不困难,但它仍然大大增加了代码的长度。

如果我们可以忽略所有这些无意义的东西,那么真正的代码将会是这样的:

nvmlInit();
nvmlSystemGetDriverVersion(result, sizeof(result));
std::cout << result;
nvmlShutdown();
无论如何,要构建它,您需要一个命令行,如:
 cl -Ic:tdknvmlinclude nv_driver_version.cpp

…假设你已经在c:tdk安装了特斯拉部署工具包。

在任何情况下,是的,我至少在某种程度上测试了这一点。在我的桌面上,它打印出:
nVidia Driver version: 314.22

在Win64上通过c++获取Nvidia驱动程序版本:

下载NVAPI https://developer.nvidia.com/rtx/path-tracing/nvapi/get-started,几个MB

下载的归档文件的主文件夹包含几个头文件,其中一个是nvapi.h。编译需要这些头文件。子文件夹amd64包含nvapi64.lib,这是链接所需要的。下面的代码现在将显示驱动程序版本:

#include <iostream>
extern "C" {
    #include "nvapi.h"
}
int main() {
    NvAPI_Status status = NVAPI_OK;
    NvAPI_ShortString str;
    
    status = NvAPI_Initialize();
    if (status == NVAPI_LIBRARY_NOT_FOUND) {
        //in this case NvAPI_GetErrorMessage() will only return an empty string
        std::printf("error no nvidia driver foundn");
    } else if (status != NVAPI_OK) {
        NvAPI_GetErrorMessage(status, str);
        std::printf("error initializing nvapi: %sn", str);
    }
    NvU32 version = 0;
    NvAPI_ShortString branch;
    status = NvAPI_SYS_GetDriverAndBranchVersion(&version, branch);
    if (status != NVAPI_OK) {
        NvAPI_GetErrorMessage(status, str);
        std::printf("error getting driver version: %sn", str);
    } else {
        std::printf("driver version %d.%d", version / 100, version % 100);
    }
}